sui_gql_client/queries/
genesis_tx.rs

1use af_sui_types::TransactionData;
2use graphql_extract::extract;
3
4use super::Error;
5use crate::{GraphQlClient, GraphQlResponseExt as _, scalars, schema};
6
7pub async fn query<C: GraphQlClient>(client: &C) -> Result<TransactionData, Error<C::Error>> {
8    let data = client
9        .query::<Query, _>(Variables { id: Some(0) })
10        .await
11        .map_err(Error::Client)?
12        .try_into_data()?;
13    extract!(data => {
14        epoch? {
15            transaction_blocks {
16                nodes[] {
17                    bcs?
18                }
19            }
20        }
21    });
22    Ok(nodes
23        .into_iter()
24        .next()
25        .ok_or("No transactions in epoch")??
26        .into_inner())
27}
28
29#[derive(cynic::QueryVariables, Clone, Debug)]
30struct Variables {
31    id: Option<af_sui_types::Version>,
32}
33
34#[derive(cynic::QueryFragment, Clone, Debug)]
35#[cynic(graphql_type = "Query", variables = "Variables")]
36struct Query {
37    #[arguments(id: $id)]
38    epoch: Option<Epoch>,
39}
40
41#[derive(cynic::QueryFragment, Clone, Debug)]
42struct Epoch {
43    #[arguments(first: 1)]
44    transaction_blocks: TransactionBlockConnection,
45}
46
47#[derive(cynic::QueryFragment, Clone, Debug)]
48struct TransactionBlockConnection {
49    nodes: Vec<TransactionBlock>,
50}
51
52#[derive(cynic::QueryFragment, Clone, Debug)]
53struct TransactionBlock {
54    bcs: Option<scalars::Base64Bcs<TransactionData>>,
55}
56
57#[cfg(test)]
58#[allow(clippy::unwrap_used)]
59#[test]
60fn init_gql_output() {
61    use cynic::QueryBuilder as _;
62    let operation = Query::build(Variables { id: None });
63    insta::assert_snapshot!(operation.query, @r###"
64    query Query($id: UInt53) {
65      epoch(id: $id) {
66        transactionBlocks(first: 1) {
67          nodes {
68            bcs
69          }
70        }
71      }
72    }
73    "###);
74}