sui_gql_client/queries/
object_arg.rs

1use af_sui_types::{Address, ObjectArg, Version};
2use cynic::{QueryFragment, QueryVariables};
3
4use super::Error;
5use super::object_args::ObjectOwner;
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(super) async fn query<C>(client: &C, object_id: Address) -> Result<ObjectArg, Error<C::Error>>
11where
12    C: GraphQlClient,
13{
14    let data = client
15        .query::<Query, _>(Variables { address: object_id })
16        .await
17        .map_err(Error::Client)?
18        .try_into_data()?;
19
20    graphql_extract::extract!(data => {
21        object? {
22            object_id
23            version
24            digest
25            owner?
26        }
27    });
28    let oarg = super::object_args::build_object_arg_default(object_id, version, owner, digest)
29        .ok_or(Error::MissingData("Digest for owned object".into()))?;
30    Ok(oarg)
31}
32
33#[derive(QueryVariables, Debug)]
34struct Variables {
35    address: Address,
36}
37
38#[derive(QueryFragment, Debug)]
39#[cynic(variables = "Variables")]
40struct Query {
41    #[arguments(address: $address)]
42    object: Option<GqlObject>,
43}
44
45#[derive(QueryFragment, Debug)]
46#[cynic(graphql_type = "Object")]
47struct GqlObject {
48    #[cynic(rename = "address")]
49    object_id: Address,
50    version: Version,
51    digest: Option<scalars::Digest>,
52    owner: Option<ObjectOwner>,
53}
54
55#[cfg(test)]
56#[test]
57fn gql_output() {
58    use cynic::QueryBuilder as _;
59
60    let vars = Variables {
61        address: Address::ZERO,
62    };
63    let operation = Query::build(vars);
64    insta::assert_snapshot!(operation.query, @r###"
65    query Query($address: SuiAddress!) {
66      object(address: $address) {
67        address
68        version
69        digest
70        owner {
71          __typename
72          ... on Immutable {
73            _
74          }
75          ... on Shared {
76            __typename
77            initialSharedVersion
78          }
79          ... on Parent {
80            __typename
81          }
82          ... on AddressOwner {
83            __typename
84          }
85        }
86      }
87    }
88    "###);
89}