Skip to main content

synd_client/client/graphql/
timeline.rs

1use tracing::instrument;
2
3use super::GraphqlRequest;
4use crate::{
5    Client, SyndApiError,
6    payload::{TimelineChangesPayload, TimelineEntryConnection},
7};
8
9const TIMELINE_CHANGES_QUERY: &str = include_str!("query/timeline_changes.gql");
10const TIMELINE_ENTRIES_QUERY: &str = include_str!("query/timeline_entries.gql");
11
12#[derive(Debug, serde::Serialize)]
13struct TimelineEntriesVariables {
14    after: Option<String>,
15    first: i64,
16}
17
18#[derive(Debug, serde::Deserialize)]
19struct TimelineEntriesData {
20    output: TimelineEntriesOutput,
21}
22
23#[derive(Debug, serde::Deserialize)]
24struct TimelineEntriesOutput {
25    timeline: TimelineEntries,
26}
27
28#[derive(Debug, serde::Deserialize)]
29struct TimelineEntries {
30    entries: TimelineEntryConnection,
31}
32
33impl From<TimelineEntriesData> for TimelineEntryConnection {
34    fn from(data: TimelineEntriesData) -> Self {
35        data.output.timeline.entries
36    }
37}
38
39#[derive(Debug, serde::Serialize)]
40struct TimelineChangesVariables {
41    since: i64,
42    first: i64,
43}
44
45#[derive(Debug, serde::Deserialize)]
46struct TimelineChangesData {
47    output: TimelineChangesOutput,
48}
49
50#[derive(Debug, serde::Deserialize)]
51struct TimelineChangesOutput {
52    timeline: TimelineChanges,
53}
54
55#[derive(Debug, serde::Deserialize)]
56struct TimelineChanges {
57    changes: TimelineChangesPayload,
58}
59
60impl From<TimelineChangesData> for TimelineChangesPayload {
61    fn from(data: TimelineChangesData) -> Self {
62        data.output.timeline.changes
63    }
64}
65
66impl Client {
67    #[instrument(skip(self))]
68    pub async fn fetch_timeline_entries(
69        &self,
70        after: Option<String>,
71        first: i64,
72    ) -> Result<TimelineEntryConnection, SyndApiError> {
73        let outcome = self
74            .execute_graphql::<_, TimelineEntriesData>(&GraphqlRequest::new(
75                TIMELINE_ENTRIES_QUERY,
76                TimelineEntriesVariables { after, first },
77            ))
78            .await?
79            .accept_partial()?;
80        outcome.warn_partial_errors();
81        Ok(outcome.into_data().into())
82    }
83
84    #[instrument(skip(self))]
85    pub async fn fetch_timeline_changes(
86        &self,
87        since: i64,
88        first: i64,
89    ) -> Result<TimelineChangesPayload, SyndApiError> {
90        let outcome = self
91            .execute_graphql::<_, TimelineChangesData>(&GraphqlRequest::new(
92                TIMELINE_CHANGES_QUERY,
93                TimelineChangesVariables { since, first },
94            ))
95            .await?
96            .accept_partial()?;
97        outcome.warn_partial_errors();
98        Ok(outcome.into_data().into())
99    }
100}