sui_gql_client/queries/
owner_df_content.rs

1use 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// ================================================================================
77//  Mostly autogenerated by: https://generator.cynic-rs.dev/
78// ================================================================================
79
80#[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}