fuel_gql_client/client/schema/
contract.rs

1use crate::client::{
2    schema::{
3        schema,
4        AssetId,
5        ContractId,
6        HexString,
7        PageInfo,
8        Salt,
9        U64,
10    },
11    PageDirection,
12    PaginatedResult,
13    PaginationRequest,
14};
15
16#[derive(cynic::QueryVariables, Debug)]
17pub struct ContractByIdArgs {
18    pub id: ContractId,
19}
20
21#[derive(cynic::QueryFragment, Debug)]
22#[cynic(
23    schema_path = "./assets/schema.sdl",
24    graphql_type = "Query",
25    variables = "ContractByIdArgs"
26)]
27pub struct ContractByIdQuery {
28    #[arguments(id: $id)]
29    pub contract: Option<Contract>,
30}
31
32#[derive(cynic::QueryFragment, Debug)]
33#[cynic(schema_path = "./assets/schema.sdl")]
34pub struct ContractBalance {
35    pub contract: ContractId,
36    pub amount: U64,
37    pub asset_id: AssetId,
38}
39
40#[derive(cynic::QueryVariables, Debug)]
41pub struct ContractBalanceQueryArgs {
42    pub id: ContractId,
43    pub asset: AssetId,
44}
45
46#[derive(cynic::QueryFragment, Debug)]
47#[cynic(
48    schema_path = "./assets/schema.sdl",
49    graphql_type = "Query",
50    variables = "ContractBalanceQueryArgs"
51)]
52pub struct ContractBalanceQuery {
53    #[arguments(contract: $id, asset: $asset)]
54    pub contract_balance: ContractBalance,
55}
56
57#[derive(cynic::QueryFragment, Debug)]
58#[cynic(schema_path = "./assets/schema.sdl")]
59pub struct Contract {
60    pub id: ContractId,
61    pub bytecode: HexString,
62    pub salt: Salt,
63}
64
65#[derive(cynic::QueryFragment, Debug)]
66#[cynic(schema_path = "./assets/schema.sdl", graphql_type = "Contract")]
67pub struct ContractIdFragment {
68    pub id: ContractId,
69}
70
71#[derive(cynic::InputObject, Clone, Debug)]
72#[cynic(schema_path = "./assets/schema.sdl")]
73pub struct ContractBalanceFilterInput {
74    /// Filter asset balances based on the `contract` field
75    pub contract: ContractId,
76}
77
78#[derive(cynic::QueryVariables, Debug)]
79pub struct ContractBalancesConnectionArgs {
80    /// Filter balances based on a filter
81    filter: ContractBalanceFilterInput,
82    /// Skip until asset id (forward pagination)
83    pub after: Option<String>,
84    /// Skip until asset id (backward pagination)
85    pub before: Option<String>,
86    /// Retrieve the first n asset balances in order (forward pagination)
87    pub first: Option<i32>,
88    /// Retrieve the last n asset balances in order (backward pagination).
89    /// Can't be used at the same time as `first`.
90    pub last: Option<i32>,
91}
92
93#[derive(cynic::QueryFragment, Debug)]
94#[cynic(schema_path = "./assets/schema.sdl")]
95pub struct ContractBalanceEdge {
96    pub cursor: String,
97    pub node: ContractBalance,
98}
99
100#[derive(cynic::QueryFragment, Debug)]
101#[cynic(schema_path = "./assets/schema.sdl")]
102pub struct ContractBalanceConnection {
103    pub edges: Vec<ContractBalanceEdge>,
104    pub page_info: PageInfo,
105}
106
107#[derive(cynic::QueryFragment, Debug)]
108#[cynic(
109    schema_path = "./assets/schema.sdl",
110    graphql_type = "Query",
111    variables = "ContractBalancesConnectionArgs"
112)]
113pub struct ContractBalancesQuery {
114    #[arguments(filter: $filter, after: $after, before: $before, first: $first, last: $last)]
115    pub contract_balances: ContractBalanceConnection,
116}
117
118impl From<ContractBalanceConnection> for PaginatedResult<ContractBalance, String> {
119    fn from(conn: ContractBalanceConnection) -> Self {
120        PaginatedResult {
121            has_next_page: conn.page_info.has_next_page,
122            has_previous_page: conn.page_info.has_previous_page,
123            cursor: conn.page_info.end_cursor,
124            results: conn.edges.into_iter().map(|e| e.node).collect(),
125        }
126    }
127}
128
129impl From<(ContractId, PaginationRequest<String>)> for ContractBalancesConnectionArgs {
130    fn from(r: (ContractId, PaginationRequest<String>)) -> Self {
131        match r.1.direction {
132            PageDirection::Forward => ContractBalancesConnectionArgs {
133                filter: ContractBalanceFilterInput { contract: r.0 },
134                after: r.1.cursor,
135                before: None,
136                first: Some(r.1.results as i32),
137                last: None,
138            },
139            PageDirection::Backward => ContractBalancesConnectionArgs {
140                filter: ContractBalanceFilterInput { contract: r.0 },
141                after: None,
142                before: r.1.cursor,
143                first: None,
144                last: Some(r.1.results as i32),
145            },
146        }
147    }
148}
149
150#[cfg(test)]
151mod tests {
152    use super::*;
153
154    #[test]
155    fn contract_by_id_query_gql_output() {
156        use cynic::QueryBuilder;
157        let operation = ContractByIdQuery::build(ContractByIdArgs {
158            id: ContractId::default(),
159        });
160        insta::assert_snapshot!(operation.query)
161    }
162}