sui_gql_client/queries/
events_backward.rs

1use super::Error;
2use crate::queries::model::fragments::{EventEdge, EventFilter};
3use crate::{GraphQlClient, GraphQlResponseExt as _, schema};
4
5/// Return a single page of events + cursors and a flag indicating if there's a previous page.
6///
7/// If `page_size` is left `None`, the server decides the size of the page.
8///
9/// The edges are returned in reverse order of which they where returned by the server
10pub async fn query<C: GraphQlClient>(
11    client: &C,
12    filter: Option<EventFilter>,
13    cursor: Option<String>,
14    page_size: Option<u32>,
15) -> super::Result<(Vec<EventEdge>, bool), C> {
16    let vars = Variables {
17        filter,
18        before: cursor,
19        last: page_size.map(|v| v as i32),
20    };
21    let data: Option<Query> = client
22        .query(vars)
23        .await
24        .map_err(Error::Client)?
25        .try_into_data()?;
26    graphql_extract::extract!(data => {
27        events? {
28            edges
29            page_info {
30                has_previous_page
31            }
32        }
33    });
34    Ok((edges, has_previous_page))
35}
36
37// =============================================================================
38//  Initial query
39// =============================================================================
40
41#[derive(cynic::QueryVariables, Debug, Clone)]
42struct Variables {
43    last: Option<i32>,
44    before: Option<String>,
45    filter: Option<EventFilter>,
46}
47
48#[derive(cynic::QueryFragment, Debug)]
49#[cynic(graphql_type = "Query", variables = "Variables")]
50struct Query {
51    #[arguments(before: $before, filter: $filter, last: $last)]
52    events: Option<EventConnection>,
53}
54
55#[cfg(test)]
56#[allow(clippy::unwrap_used)]
57#[test]
58fn init_gql_output() {
59    use cynic::QueryBuilder as _;
60    let filter = EventFilter {
61        sender: None,
62        after_checkpoint: None,
63        before_checkpoint: None,
64        at_checkpoint: None,
65        type_: None,
66        module: None,
67    };
68    let vars = Variables {
69        filter: Some(filter),
70        before: None,
71        last: None,
72    };
73    let operation = Query::build(vars);
74    insta::assert_snapshot!(operation.query, @r###"
75    query Query($last: Int, $before: String, $filter: EventFilter) {
76      events(before: $before, filter: $filter, last: $last) {
77        edges {
78          node {
79            timestamp
80            contents {
81              type {
82                repr
83              }
84              bcs
85            }
86          }
87          cursor
88        }
89        pageInfo {
90          hasPreviousPage
91        }
92      }
93    }
94    "###);
95}
96
97// =============================================================================
98//  Inner query fragments
99// =============================================================================
100
101#[derive(cynic::QueryFragment, Clone, Debug)]
102struct EventConnection {
103    edges: Vec<EventEdge>,
104    page_info: HasPreviousPage,
105}
106
107#[derive(cynic::QueryFragment, Clone, Debug)]
108#[cynic(graphql_type = "PageInfo")]
109pub struct HasPreviousPage {
110    pub has_previous_page: bool,
111}