todoist_tui/
sync.rs

1use serde::{Deserialize, Serialize};
2use std::collections::HashMap;
3use uuid::Uuid;
4
5use crate::model::{command::Command, item::Item, project::Project, section::Section, user::User};
6
7pub mod client;
8
9#[derive(Debug, Serialize, Deserialize, Default)]
10pub struct Response {
11    pub sync_token: String,
12
13    #[serde(default)]
14    pub projects: Vec<Project>,
15
16    #[serde(default)]
17    pub items: Vec<Item>,
18
19    #[serde(default)]
20    pub sections: Vec<Section>,
21
22    pub user: Option<User>,
23
24    pub full_sync: bool,
25
26    pub sync_status: Option<HashMap<Uuid, Status>>,
27
28    pub temp_id_mapping: HashMap<String, String>,
29}
30
31#[derive(Debug, Serialize, Deserialize)]
32pub struct Request {
33    pub commands: Vec<Command>,
34    pub resource_types: Vec<ResourceType>,
35    pub sync_token: String,
36}
37
38#[derive(Debug, Serialize, Deserialize, PartialEq)]
39pub enum Status {
40    #[serde(rename = "ok")]
41    Ok,
42    #[serde(untagged)]
43    Error(StatusError),
44}
45
46#[derive(Debug, Serialize, Deserialize, PartialEq)]
47pub struct StatusError {
48    #[serde(rename = "error_code")]
49    pub code: u32,
50    #[serde(rename = "error")]
51    pub message: String,
52}
53
54#[derive(Debug, Serialize, Deserialize, PartialEq)]
55pub enum ResourceType {
56    #[serde(rename = "items")]
57    Items,
58    #[serde(rename = "projects")]
59    Projects,
60    #[serde(rename = "sections")]
61    Sections,
62    #[serde(rename = "user")]
63    User,
64}
65
66impl ResourceType {
67    /// Returns all of the resource types that should be requested in a full sync
68    #[must_use]
69    pub fn all() -> Vec<Self> {
70        vec![Self::Items, Self::Projects, Self::Sections, Self::User]
71    }
72}