sui_gql_client/queries/
coin_metadata.rs

1use super::Error;
2use crate::{GraphQlClient, GraphQlResponseExt, schema};
3
4pub async fn query<C: GraphQlClient>(
5    client: &C,
6    type_: impl AsRef<str>,
7) -> Result<(Option<u8>, Option<String>, Option<String>), Error<C::Error>> {
8    let data = client
9        .query::<Query, _>(QueryVariables {
10            coin_type: type_.as_ref(),
11        })
12        .await
13        .map_err(Error::Client)?
14        .try_into_data()?;
15    graphql_extract::extract!(data => {
16        coin_metadata? {
17            decimals
18            name
19            symbol
20        }
21    });
22    Ok((decimals.map(|d| d as u8), name, symbol))
23}
24
25#[cfg(test)]
26#[allow(clippy::unwrap_used)]
27#[test]
28fn gql_output() {
29    use cynic::QueryBuilder as _;
30
31    let vars = QueryVariables {
32        coin_type: "0x2::sui::Sui",
33    };
34    let operation = Query::build(vars);
35    insta::assert_snapshot!(operation.query, @r###"
36    query Query($coinType: String!) {
37      coinMetadata(coinType: $coinType) {
38        decimals
39        name
40        symbol
41      }
42    }
43    "###);
44}
45
46#[derive(cynic::QueryVariables, Debug)]
47struct QueryVariables<'a> {
48    coin_type: &'a str,
49}
50
51#[derive(cynic::QueryFragment, Debug)]
52#[cynic(graphql_type = "Query", variables = "QueryVariables")]
53struct Query {
54    #[arguments(coinType: $coin_type)]
55    coin_metadata: Option<CoinMetadata>,
56}
57
58#[derive(cynic::QueryFragment, Debug)]
59struct CoinMetadata {
60    decimals: Option<i32>,
61    name: Option<String>,
62    symbol: Option<String>,
63}