sui_gql_client/queries/
full_object.rs

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