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