sui_gql_client/queries/
latest_package.rs

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