libtodoist/api/
label.rs

1pub mod personal {
2    use serde::Serialize;
3
4    use crate::enums::Color;
5    use crate::{models, EmptyQuery};
6    use crate::error::Error;
7
8    crate::endpoint_group!();
9
10    impl Client<'_> {
11        pub async fn list(&self) -> Result<Vec<models::Label>, Error> {
12            match self.api_client.get("/labels".to_string(), &EmptyQuery{}).await {
13                Err(err) => Err(Error::RequestError(err.to_string())),
14                Ok(None) => Ok(vec![]),
15                Ok(Some(text)) => match serde_json::from_str(&text) {
16                    Ok(labels) => Ok(labels),
17                    Err(err) => Err(Error::ParseError(err.to_string())),
18                },
19            }
20        }
21
22        pub async fn create(&self, request: CreateRequest) -> Result<Option<models::Label>, Error> {
23            match self.api_client.post("/labels".to_string(), request).await {
24                Err(err) => Err(Error::RequestError(err.to_string())),
25                Ok(None) => Ok(None),
26                Ok(Some(text)) => match serde_json::from_str(&text) {
27                    Ok(label) => Ok(Some(label)),
28                    Err(err) => Err(Error::ParseError(err.to_string())),
29                },
30            }
31        }
32
33        pub async fn get(&self, id: String) -> Result<Option<models::Label>, Error> {
34            match self.api_client.get(format!("/labels/{}", id), &EmptyQuery{}).await {
35                Err(err) => Err(Error::RequestError(err.to_string())),
36                Ok(None) => Ok(None),
37                Ok(Some(text)) => match serde_json::from_str(&text) {
38                    Ok(label) => Ok(Some(label)),
39                    Err(err) => Err(Error::ParseError(err.to_string()))
40                },
41            }
42        }
43
44        pub async fn delete(&self, id: String) -> Option<Error> {
45            match self.api_client.delete(format!("/labels/{}", id)).await {
46                Err(err) => Some(Error::RequestError(err.to_string())),
47                Ok(_) => None,
48            }
49        }
50
51        pub async fn update(&self, id: String, request: UpdateRequest) -> Result<Option<models::Label>, Error> {
52            match self.api_client.post(format!("/labels/{}", id), request).await {
53                Err(err) => Err(Error::RequestError(err.to_string())),
54                Ok(None) => Ok(None),
55                Ok(Some(text)) => match serde_json::from_str(&text) {
56                    Ok(label) => Ok(Some(label)),
57                    Err(_) => Err(Error::ParseError("unable to parse response".to_string()))
58                },
59            }
60        }
61    }
62
63    #[derive(Serialize)]
64    pub struct CreateRequest {
65        pub name: String,
66        pub order: i64,
67        pub color: Color,
68        pub is_favorite: bool,
69    }
70
71    #[derive(Serialize)]
72    pub struct UpdateRequest {
73        pub name: String,
74        pub order: i64,
75        pub color: Color,
76        pub is_favorite: bool,
77    }
78}
79
80pub mod shared {
81    use serde::Serialize;
82
83    use crate::{models, error::Error};
84
85    crate::endpoint_group!();
86
87    impl Client<'_> {
88        pub async fn list(&self, omit_personal: bool) -> Result<Vec<models::Label>, Error> {
89            match self.api_client.get("/labels".to_string(), &ListRequest{omit_personal}).await {
90                Err(err) => Err(Error::RequestError(err.to_string())),
91                Ok(None) => Ok(vec![]),
92                Ok(Some(text)) => match serde_json::from_str(&text) {
93                    Ok(labels) => Ok(labels),
94                    Err(err) => Err(Error::ParseError(err.to_string())),
95                },
96            }
97        }
98
99        pub async fn rename(&self, request: RenameRequest) -> Option<Error> {
100            match self.api_client.post("/labels/shared/rename".to_string(), request).await {
101                Err(err) => Some(Error::RequestError(err.to_string())),
102                Ok(_) => None,
103            }
104        }
105
106        pub async fn remove(&self, name: String) -> Option<Error> {
107            match self.api_client.post("/labels/shared/rename".to_string(), &RemoveRequest{name}).await {
108                Err(err) => Some(Error::RequestError(err.to_string())),
109                Ok(_) => None,
110            }
111        }
112    }
113
114    #[derive(Serialize)]
115    pub struct ListRequest {
116        pub omit_personal: bool,
117    }
118
119    #[derive(Serialize)]
120    pub struct RenameRequest {
121        pub name: String,
122        pub new_name: String,
123    }
124
125    #[derive(Serialize)]
126    pub struct RemoveRequest {
127        pub name: String,
128    }
129}