sui_gql_client/queries/
object_content.rs

1use af_sui_types::{Address, Version};
2use graphql_extract::extract;
3
4use super::Error;
5use super::fragments::{MoveObjectContent, MoveValueRaw};
6use super::outputs::RawMoveStruct;
7use crate::{GraphQlClient, GraphQlResponseExt, schema};
8
9pub async fn query<C: GraphQlClient>(
10    client: &C,
11    object_id: Address,
12    version: Option<u64>,
13) -> Result<RawMoveStruct, Error<C::Error>> {
14    let vars = Variables {
15        address: object_id,
16        version,
17    };
18    let data = client
19        .query::<Query, Variables>(vars)
20        .await
21        .map_err(Error::Client)?
22        .try_into_data()?;
23    extract!(data => {
24        object? {
25            as_move_object? {
26                contents?
27            }
28        }
29    });
30    Ok(contents
31        .try_into()
32        .expect("Only structs can be top-level objects"))
33}
34
35#[derive(cynic::QueryVariables, Debug)]
36struct Variables {
37    address: Address,
38    version: Option<Version>,
39}
40
41#[derive(cynic::QueryFragment, Clone, Debug)]
42#[cynic(variables = "Variables")]
43struct Query {
44    #[arguments(address: $address, version: $version)]
45    object: Option<ObjectContent>,
46}
47
48#[cfg(test)]
49#[allow(clippy::unwrap_used)]
50#[test]
51fn gql_output() {
52    use cynic::QueryBuilder as _;
53
54    let vars = Variables {
55        address: Address::new(rand::random()),
56        version: None,
57    };
58    let operation = Query::build(vars);
59    insta::assert_snapshot!(operation.query, @r###"
60    query Query($address: SuiAddress!, $version: UInt53) {
61      object(address: $address, version: $version) {
62        asMoveObject {
63          contents {
64            type {
65              repr
66            }
67            bcs
68          }
69        }
70      }
71    }
72    "###);
73}
74
75#[derive(cynic::QueryFragment, Clone, Debug)]
76#[cynic(graphql_type = "Object")]
77struct ObjectContent {
78    as_move_object: Option<MoveObjectContent<MoveValueRaw>>,
79}