sui_gql_client/queries/
latest_object_version.rs

1use af_sui_types::Address;
2use graphql_extract::extract;
3
4use crate::queries::Error;
5use crate::{GraphQlClient, GraphQlResponseExt as _, schema};
6
7pub async fn query<C>(client: &C, object_id: Address) -> Result<(u64, u64), Error<C::Error>>
8where
9    C: GraphQlClient,
10{
11    let data = client
12        .query::<Query, _>(Variables { object_id })
13        .await
14        .map_err(Error::Client)?
15        .try_into_data()?;
16
17    extract!(data => {
18        checkpoint? {
19            sequence_number
20        }
21        object? {
22            version
23        }
24    });
25
26    Ok((sequence_number, version))
27}
28
29#[derive(cynic::QueryVariables, Debug)]
30struct Variables {
31    object_id: Address,
32}
33
34#[derive(cynic::QueryFragment, Debug)]
35#[cynic(variables = "Variables")]
36struct Query {
37    checkpoint: Option<Checkpoint>,
38
39    #[arguments(address: $object_id)]
40    object: Option<Object>,
41}
42
43#[derive(cynic::QueryFragment, Debug)]
44struct Object {
45    version: af_sui_types::Version,
46}
47
48#[derive(cynic::QueryFragment, Debug)]
49struct Checkpoint {
50    sequence_number: af_sui_types::Version,
51}
52
53#[cfg(test)]
54#[allow(clippy::unwrap_used)]
55#[test]
56fn gql_output() {
57    use cynic::QueryBuilder as _;
58
59    let vars = Variables {
60        object_id: Address::new(rand::random()),
61    };
62    let operation = Query::build(vars);
63    insta::assert_snapshot!(operation.query, @r###"
64    query Query($objectId: SuiAddress!) {
65      checkpoint {
66        sequenceNumber
67      }
68      object(address: $objectId) {
69        version
70      }
71    }
72    "###);
73}