fuel_gql_client/client/schema/
coin.rs

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