notion_tools/structs/
page.rs

1use crate::structs::common::*;
2use fxhash::FxHashMap;
3use serde::{Deserialize, Serialize};
4
5#[derive(Debug, Clone, Serialize, Deserialize, Default)]
6pub struct Rollup {
7    #[serde(rename = "type", default = "String::new")]
8    pub type_name: String,
9    #[serde(default = "Option::default")]
10    pub array: Option<Vec<PageProperty>>,
11    #[serde(default = "Option::default")]
12    pub date: Option<Date>,
13    #[serde(default = "Option::default")]
14    pub incomplete: Option<bool>,
15    #[serde(default = "Option::default")]
16    pub number: Option<f64>,
17    #[serde(default = "Option::default")]
18    pub unsupported: Option<String>,
19    #[serde(default = "Option::default")]
20    pub function: Option<String>,
21}
22
23#[derive(Debug, Clone, Serialize, Deserialize, Default)]
24pub struct PageProperty {
25    // properties
26    #[serde(default = "String::new", skip_serializing)]
27    pub id: String,
28    #[serde(default = "String::new", skip_serializing)]
29    pub name: String,
30    #[serde(rename = "type", default = "String::new", skip_serializing)]
31    pub type_name: String,
32    #[serde(default = "Option::default", skip_serializing)]
33    pub created_by: Option<User>,
34    #[serde(default = "Option::default", skip_serializing)]
35    pub created_time: Option<String>,
36    #[serde(default = "Option::default", skip_serializing)]
37    pub last_edited_by: Option<User>,
38    #[serde(default = "Option::default", skip_serializing)]
39    pub last_edited_time: Option<String>,
40
41    // fields
42    #[serde(default = "Option::default", skip_serializing_if = "Option::is_none")]
43    pub checkbox: Option<bool>,
44    #[serde(default = "Option::default", skip_serializing_if = "Option::is_none")]
45    pub date: Option<Date>,
46    #[serde(default = "Option::default", skip_serializing_if = "Option::is_none")]
47    pub email: Option<Email>,
48    #[serde(default = "Option::default", skip_serializing_if = "Option::is_none")]
49    pub files: Option<Vec<File>>,
50    #[serde(default = "Option::default", skip_serializing_if = "Option::is_none")]
51    pub formula: Option<Formula>,
52    #[serde(default = "Option::default", skip_serializing_if = "Option::is_none")]
53    pub multi_select: Option<Vec<SelectOption>>,
54    #[serde(default = "Option::default", skip_serializing_if = "Option::is_none")]
55    pub number: Option<f64>,
56    #[serde(default = "Option::default", skip_serializing_if = "Option::is_none")]
57    pub people: Option<Vec<User>>,
58    #[serde(default = "Option::default", skip_serializing_if = "Option::is_none")]
59    pub phone_number: Option<PhoneNumber>,
60    #[serde(default = "Option::default", skip_serializing_if = "Option::is_none")]
61    pub relation: Option<Vec<Relation>>,
62    #[serde(default = "Option::default", skip_serializing_if = "Option::is_none")]
63    pub rich_text: Option<Vec<RichText>>,
64    #[serde(default = "Option::default", skip_serializing_if = "Option::is_none")]
65    pub rollup: Option<Rollup>,
66    #[serde(default = "Option::default", skip_serializing_if = "Option::is_none")]
67    pub select: Option<SelectOption>,
68    #[serde(default = "Option::default", skip_serializing_if = "Option::is_none")]
69    pub status: Option<SelectOption>,
70    #[serde(default = "Option::default", skip_serializing_if = "Option::is_none")]
71    pub title: Option<Vec<RichText>>,
72    #[serde(default = "Option::default", skip_serializing_if = "Option::is_none")]
73    pub url: Option<String>,
74    #[serde(default = "Option::default", skip_serializing_if = "Option::is_none")]
75    pub unique_id: Option<UniqueId>,
76}
77
78impl PageProperty {
79    pub fn checkbox(value: bool) -> Self {
80        let mut prop = PageProperty::default();
81        prop.type_name = "checkbox".to_string();
82        prop.checkbox = Some(value);
83        return prop;
84    }
85
86    pub fn date(value: String) -> Self {
87        let mut prop = PageProperty::default();
88        prop.type_name = "date".to_string();
89        prop.date = Some(Date {
90            start: value.to_string(),
91        });
92        return prop;
93    }
94
95    pub fn email(value: String) -> Self {
96        let mut prop = PageProperty::default();
97        prop.type_name = "email".to_string();
98        prop.email = Some(Email {
99            email: value.to_string(),
100        });
101        return prop;
102    }
103
104    pub fn multi_select(value: Vec<String>) -> Self {
105        let mut prop = PageProperty::default();
106        prop.type_name = "multi_select".to_string();
107        let mut options = Vec::new();
108        value.iter().for_each(|v| {
109            options.push(SelectOption::new(v.to_string(), Color::Default));
110        });
111        prop.multi_select = Some(options);
112        return prop;
113    }
114
115    pub fn number(value: f64) -> Self {
116        let mut prop = PageProperty::default();
117        prop.type_name = "number".to_string();
118        prop.number = Some(value);
119        return prop;
120    }
121
122    pub fn phone_number(value: String) -> Self {
123        let mut prop = PageProperty::default();
124        prop.type_name = "phone_number".to_string();
125        prop.phone_number = Some(PhoneNumber {
126            phone_number: value.to_string(),
127        });
128        return prop;
129    }
130
131    pub fn relation(value: Vec<String>) -> Self {
132        let mut prop = PageProperty::default();
133        prop.type_name = "relation".to_string();
134        let mut relations = Vec::new();
135        value.iter().for_each(|v| {
136            relations.push(Relation { id: v.to_string() });
137        });
138        prop.relation = Some(relations);
139        return prop;
140    }
141
142    pub fn rich_text(value: Vec<RichText>) -> Self {
143        let mut prop = PageProperty::default();
144        prop.type_name = "rich_text".to_string();
145        prop.rich_text = Some(value);
146        return prop;
147    }
148
149    pub fn select(value: String) -> Self {
150        let mut prop = PageProperty::default();
151        prop.type_name = "select".to_string();
152        prop.select = Some(SelectOption::new(value.to_string(), Color::Default));
153        return prop;
154    }
155
156    pub fn status(value: String) -> Self {
157        let mut prop = PageProperty::default();
158        prop.type_name = "status".to_string();
159        prop.status = Some(SelectOption::new(value.to_string(), Color::Default));
160        return prop;
161    }
162    pub fn title(value: RichText) -> Self {
163        let mut prop = PageProperty::default();
164        prop.type_name = "title".to_string();
165        prop.title = Some(vec![value]);
166        return prop;
167    }
168    pub fn url(value: String) -> Self {
169        let mut prop = PageProperty::default();
170        prop.type_name = "url".to_string();
171        prop.url = Some(value.to_string());
172        return prop;
173    }
174
175    pub fn get_value(&self) -> String {
176        match &self.type_name[..] {
177            "checkbox" => {
178                if let Some(value) = &self.checkbox {
179                    return value.to_string();
180                }
181            }
182            "date" => {
183                if let Some(value) = &self.date {
184                    return value.start.to_string();
185                }
186            }
187            "email" => {
188                if let Some(value) = &self.email {
189                    return value.email.to_string();
190                }
191            }
192            "multi_select" => {
193                if let Some(value) = &self.multi_select {
194                    let mut values = Vec::new();
195                    value.iter().for_each(|v| {
196                        values.push(v.name.to_string());
197                    });
198                    return values.join(", ");
199                }
200            }
201            "number" => {
202                if let Some(value) = &self.number {
203                    return value.to_string();
204                }
205            }
206            "phone_number" => {
207                if let Some(value) = &self.phone_number {
208                    return value.phone_number.to_string();
209                }
210            }
211            "relation" => {
212                if let Some(value) = &self.relation {
213                    let mut values = Vec::new();
214                    value.iter().for_each(|v| {
215                        values.push(v.id.to_string());
216                    });
217                    return values.join(", ");
218                }
219            }
220            "rich_text" => {
221                if let Some(value) = &self.rich_text {
222                    let mut values = Vec::new();
223                    value.iter().for_each(|v| {
224                        values.push(v.plain_text.to_string());
225                    });
226                    return values.join(", ");
227                }
228            }
229            "select" => {
230                if let Some(value) = &self.select {
231                    return value.name.to_string();
232                }
233            }
234            "status" => {
235                if let Some(value) = &self.status {
236                    return value.name.to_string();
237                }
238            }
239            "title" => {
240                if let Some(value) = &self.title {
241                    let mut values = Vec::new();
242                    value.iter().for_each(|v| {
243                        values.push(v.plain_text.to_string());
244                    });
245                    return values.join(", ");
246                }
247            }
248            "url" => {
249                if let Some(value) = &self.url {
250                    return value.to_string();
251                }
252            }
253            _ => {}
254        }
255        return "".to_string();
256    }
257}
258
259#[derive(Debug, Clone, Serialize, Deserialize)]
260pub struct Page {
261    #[serde(default = "Parent::default")]
262    pub parent: Parent,
263    #[serde(default = "FxHashMap::default")]
264    pub properties: FxHashMap<String, PageProperty>,
265    #[serde(default = "String::new", skip_serializing)]
266    pub object: String,
267    #[serde(default = "String::new", skip_serializing)]
268    pub id: String,
269    #[serde(default = "String::new", skip_serializing)]
270    pub created_time: String,
271    #[serde(default = "String::new", skip_serializing)]
272    pub last_edited_time: String,
273    #[serde(default = "User::default", skip_serializing)]
274    pub created_by: User,
275    #[serde(default = "User::default", skip_serializing)]
276    pub last_edited_by: User,
277    #[serde(default = "bool::default", skip_serializing_if = "std::ops::Not::not")]
278    pub archived: bool,
279    #[serde(default = "bool::default", skip_serializing)]
280    pub in_trash: bool,
281    #[serde(default = "Option::default", skip_serializing)]
282    pub next_cursor: Option<String>,
283    #[serde(default = "bool::default", skip_serializing)]
284    pub has_more: bool,
285    #[serde(rename = "type", default = "String::new", skip_serializing)]
286    pub type_name: String,
287    #[serde(default = "u32::default", skip_serializing)]
288    pub status: u32,
289    #[serde(default = "String::new", skip_serializing)]
290    pub code: String,
291    #[serde(default = "String::new", skip_serializing)]
292    pub message: String,
293}
294
295impl Default for Page {
296    fn default() -> Self {
297        let page = Page {
298            parent: Parent {
299                type_name: ParentType::Database,
300                database_id: None,
301                page_id: None,
302                workspace_id: None,
303                block_id: None,
304            },
305            properties: FxHashMap::default(),
306            object: "page".to_string(),
307            id: "".to_string(),
308            created_time: "".to_string(),
309            last_edited_time: "".to_string(),
310            created_by: User::default(),
311            last_edited_by: User::default(),
312            archived: false,
313            in_trash: false,
314            next_cursor: None,
315            has_more: false,
316            type_name: "page".to_string(),
317            status: 200,
318            code: "".to_string(),
319            message: "".to_string(),
320        };
321        return page;
322    }
323}
324
325impl Page {
326    pub fn from_properties(properties: FxHashMap<String, PageProperty>) -> Self {
327        let mut page = Page::default();
328        page.properties = properties;
329        return page;
330    }
331}
332
333#[derive(Debug, Clone, Serialize, Deserialize)]
334pub struct PageResponse {
335    #[serde(default = "String::new")]
336    pub object: String,
337    #[serde(rename = "type", default = "Option::default")]
338    pub type_name: Option<String>,
339    #[serde(default = "u32::default")]
340    pub status: u32,
341    #[serde(default = "String::new")]
342    pub code: String,
343    #[serde(default = "String::new")]
344    pub message: String,
345    #[serde(default = "Vec::new")]
346    pub results: Vec<Page>,
347    #[serde(default = "Option::default")]
348    pub has_more: Option<bool>,
349    #[serde(default = "Option::default")]
350    pub next_cursor: Option<String>,
351}