sui_gql_client/queries/
epoch_final_checkpoint_num.rs

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