sui_gql_client/queries/
full_object.rs

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