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