fuel_core_client/client/schema/
contract.rs

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