sui_gql_client/queries/
owner_df_content.rs1use af_sui_types::Address as SuiAddress;
2use cynic::GraphQlResponse;
3
4use super::Error;
5use super::fragments::MoveValueRaw;
6use super::outputs::RawMoveValue;
7use crate::{GraphQlClient, GraphQlResponseExt, missing_data, scalars, schema};
8
9pub async fn query<C: GraphQlClient>(
10 client: &C,
11 address: SuiAddress,
12 RawMoveValue {
13 type_: df_name_type,
14 bcs: df_name_bcs,
15 }: RawMoveValue,
16 root_version: Option<u64>,
17) -> Result<RawMoveValue, Error<C::Error>> {
18 let vars = QueryVariables {
19 address,
20 root_version,
21 name: DynamicFieldName {
22 type_: scalars::TypeTag(df_name_type),
23 bcs: scalars::Base64::new(df_name_bcs),
24 },
25 };
26 let result: GraphQlResponse<Query> = client.query(vars).await.map_err(Error::Client)?;
27 let data = result
28 .try_into_data()?
29 .ok_or(missing_data!("Response empty"))?;
30 let df_value = data
31 .owner
32 .ok_or(missing_data!("Owner not found"))?
33 .dynamic_field
34 .ok_or(missing_data!("Dynamic field not found"))?
35 .value
36 .ok_or(missing_data!("No dynamic field value"))?;
37 match df_value {
38 DynamicFieldValue::MoveValue(value) => Ok(value.into()),
39 DynamicFieldValue::Unknown => Err(missing_data!("Not a dynamic field type")),
40 }
41}
42
43#[cfg(test)]
44#[allow(clippy::unwrap_used)]
45#[test]
46fn gql_output() {
47 use cynic::QueryBuilder as _;
48 let vars = QueryVariables {
49 address: SuiAddress::new(rand::random()),
50 root_version: None,
51 name: DynamicFieldName {
52 type_: scalars::TypeTag("0x2::sui::SUI".parse().unwrap()),
53 bcs: scalars::Base64::new(vec![]),
54 },
55 };
56 let operation = Query::build(vars);
57 insta::assert_snapshot!(operation.query, @r###"
58 query Query($address: SuiAddress!, $name: DynamicFieldName!, $rootVersion: UInt53) {
59 owner(address: $address, rootVersion: $rootVersion) {
60 dynamicField(name: $name) {
61 value {
62 __typename
63 ... on MoveValue {
64 type {
65 repr
66 }
67 bcs
68 }
69 }
70 }
71 }
72 }
73 "###);
74}
75
76#[derive(cynic::QueryVariables, Debug)]
81struct QueryVariables {
82 address: SuiAddress,
83 name: DynamicFieldName,
84 root_version: Option<af_sui_types::Version>,
85}
86
87#[derive(cynic::InputObject, Debug)]
88struct DynamicFieldName {
89 #[cynic(rename = "type")]
90 type_: scalars::TypeTag,
91 bcs: scalars::Base64<Vec<u8>>,
92}
93
94#[derive(cynic::QueryFragment, Debug)]
95#[cynic(variables = "QueryVariables")]
96struct Query {
97 #[arguments(address: $address, rootVersion: $root_version)]
98 owner: Option<Owner>,
99}
100
101#[derive(cynic::QueryFragment, Debug)]
102#[cynic(variables = "QueryVariables")]
103struct Owner {
104 #[arguments(name: $name)]
105 dynamic_field: Option<_DynamicField>,
106}
107
108#[derive(cynic::QueryFragment, Debug)]
109#[cynic(graphql_type = "DynamicField")]
110struct _DynamicField {
111 value: Option<DynamicFieldValue>,
112}
113
114#[derive(cynic::InlineFragments, Debug)]
115enum DynamicFieldValue {
116 MoveValue(MoveValueRaw),
117 #[cynic(fallback)]
118 Unknown,
119}