sui_gql_client/queries/
object_content.rs1use 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}