notion_tools/structs/
common.rs

1use serde::{Deserialize, Serialize};
2
3#[derive(Debug, Clone, Serialize, Deserialize, Default)]
4pub enum Color {
5    #[default]
6    #[serde(rename = "default")]
7    Default,
8    #[serde(rename = "blue")]
9    Blue,
10    #[serde(rename = "blue_background")]
11    BlueBackground,
12    #[serde(rename = "brown")]
13    Brown,
14    #[serde(rename = "brown_background")]
15    BrownBackground,
16    #[serde(rename = "gray")]
17    Gray,
18    #[serde(rename = "gray_background")]
19    GrayBackground,
20    #[serde(rename = "green")]
21    Green,
22    #[serde(rename = "green_background")]
23    GreenBackground,
24    #[serde(rename = "orange")]
25    Orange,
26    #[serde(rename = "orange_background")]
27    OrangeBackground,
28    #[serde(rename = "yellow")]
29    Yellow,
30    #[serde(rename = "yellow_background")]
31    YellowBackground,
32    #[serde(rename = "pink")]
33    Pink,
34    #[serde(rename = "pink_background")]
35    PinkBackground,
36    #[serde(rename = "purple")]
37    Purple,
38    #[serde(rename = "purple_background")]
39    PurpleBackground,
40    #[serde(rename = "red")]
41    Red,
42    #[serde(rename = "red_background")]
43    RedBackground,
44}
45
46#[derive(Debug, Clone, Serialize, Deserialize, Default)]
47pub struct Icon {
48    #[serde(default = "String::new")]
49    pub emoji: String,
50}
51
52impl Icon {
53    pub fn from_str(emoji: String) -> Self {
54        let icon = Icon {
55            emoji: emoji.to_string(),
56        };
57        return icon;
58    }
59}
60
61#[derive(Debug, Clone, Serialize, Deserialize, Default)]
62pub struct Date {
63    #[serde(default = "String::new")]
64    pub start: String,
65}
66
67#[derive(Debug, Clone, Serialize, Deserialize, Default)]
68pub struct Email {
69    #[serde(default = "String::new")]
70    pub email: String,
71}
72
73#[derive(Debug, Clone, Serialize, Deserialize, Default)]
74pub struct ExternalUrl {
75    #[serde(default = "String::new")]
76    pub url: String,
77}
78
79#[derive(Debug, Clone, Serialize, Deserialize, Default)]
80pub struct File {
81    #[serde(default = "String::new")]
82    pub name: String,
83    #[serde(rename = "type", default = "String::new")]
84    pub type_name: String,
85    #[serde(default = "ExternalUrl::default")]
86    pub external: ExternalUrl,
87    #[serde(default = "Vec::default", skip_serializing_if = "Vec::is_empty")]
88    pub caption: Vec<RichText>,
89}
90
91#[derive(Debug, Clone, Serialize, Deserialize, Default)]
92pub struct Formula {
93    #[serde(rename = "type", default = "String::new")]
94    pub type_name: String,
95    #[serde(default = "bool::default")]
96    pub boolean: bool,
97    #[serde(default = "String::new")]
98    pub date: String,
99    #[serde(default = "f64::default")]
100    pub number: f64,
101    #[serde(default = "String::new")]
102    pub string: String,
103}
104
105#[derive(Debug, Clone, Serialize, Deserialize, Default)]
106pub struct PhoneNumber {
107    #[serde(default = "String::new")]
108    pub phone_number: String,
109}
110
111#[derive(Debug, Clone, Serialize, Deserialize, Default)]
112pub struct SelectOption {
113    #[serde(default = "String::new", skip_serializing)]
114    pub id: String,
115    #[serde(default = "String::new")]
116    pub name: String,
117    #[serde(default = "Color::default", skip_serializing)]
118    pub color: Color,
119}
120
121impl SelectOption {
122    pub fn new(name: String, color: Color) -> Self {
123        let name = name.replace(",", " ");
124        let option = SelectOption {
125            id: "".to_string(),
126            name: name.to_string(),
127            color,
128        };
129        return option;
130    }
131}
132
133#[derive(Debug, Clone, Serialize, Deserialize, Default)]
134pub struct Relation {
135    #[serde(default = "String::new")]
136    pub id: String,
137}
138
139#[derive(Debug, Clone, Serialize, Deserialize, Default)]
140pub struct UniqueId {
141    #[serde(default = "u128::default")]
142    pub number: u128,
143    #[serde(default = "Option::default")]
144    pub prefix: Option<String>,
145}
146
147#[derive(Debug, Clone, Serialize, Deserialize, Default)]
148pub struct User {
149    #[serde(default = "String::new")]
150    pub object: String,
151    #[serde(default = "String::new")]
152    pub id: String,
153    #[serde(default = "String::new")]
154    pub name: String,
155    #[serde(default = "Option::default")]
156    pub avatar_url: Option<String>,
157    #[serde(rename = "type", default = "String::new")]
158    pub type_name: String,
159    #[serde(default = "Email::default")]
160    pub person: Email,
161}
162
163#[derive(Debug, Clone, Serialize, Deserialize)]
164pub enum ParentType {
165    #[serde(rename = "database_id")]
166    Database,
167    #[serde(rename = "page_id")]
168    Page,
169    #[serde(rename = "workspace_id")]
170    Workspace,
171    #[serde(rename = "block_id")]
172    Block,
173}
174
175impl Default for ParentType {
176    fn default() -> Self {
177        return ParentType::Database;
178    }
179}
180
181#[derive(Debug, Clone, Serialize, Deserialize, Default)]
182pub struct Parent {
183    #[serde(rename = "type", default = "ParentType::default")]
184    pub type_name: ParentType,
185    #[serde(default = "Option::default", skip_serializing_if = "Option::is_none")]
186    pub database_id: Option<String>,
187    #[serde(default = "Option::default", skip_serializing_if = "Option::is_none")]
188    pub page_id: Option<String>,
189    #[serde(default = "Option::default", skip_serializing_if = "Option::is_none")]
190    pub workspace_id: Option<String>,
191    #[serde(default = "Option::default", skip_serializing_if = "Option::is_none")]
192    pub block_id: Option<String>,
193}
194
195impl Parent {
196    fn database(database_id: String) -> Self {
197        let parent = Parent {
198            type_name: ParentType::Database,
199            database_id: Some(database_id.to_string()),
200            page_id: None,
201            workspace_id: None,
202            block_id: None,
203        };
204        return parent;
205    }
206
207    fn page(page_id: String) -> Self {
208        let parent = Parent {
209            type_name: ParentType::Page,
210            database_id: None,
211            page_id: Some(page_id.to_string()),
212            workspace_id: None,
213            block_id: None,
214        };
215        return parent;
216    }
217
218    fn workspace(workspace_id: String) -> Self {
219        let parent = Parent {
220            type_name: ParentType::Workspace,
221            database_id: None,
222            page_id: None,
223            workspace_id: Some(workspace_id.to_string()),
224            block_id: None,
225        };
226        return parent;
227    }
228
229    fn block(block_id: String) -> Self {
230        let parent = Parent {
231            type_name: ParentType::Block,
232            database_id: None,
233            page_id: None,
234            workspace_id: None,
235            block_id: Some(block_id.to_string()),
236        };
237        return parent;
238    }
239
240    pub fn from(parent_type: ParentType, parent_id: String) -> Self {
241        match parent_type {
242            ParentType::Database => return Parent::database(parent_id),
243            ParentType::Page => return Parent::page(parent_id),
244            ParentType::Workspace => return Parent::workspace(parent_id),
245            ParentType::Block => return Parent::block(parent_id),
246        }
247    }
248}
249
250// ------ Rich Text ------
251#[derive(Debug, Clone, Serialize, Deserialize, Default)]
252pub struct TextObject {
253    #[serde(default = "String::new")]
254    pub content: String,
255    #[serde(default = "Option::default")]
256    pub link: Option<String>,
257}
258
259#[derive(Debug, Clone, Serialize, Deserialize)]
260pub struct AnnotationObject {
261    #[serde(default = "bool::default")]
262    pub bold: bool,
263    #[serde(default = "bool::default")]
264    pub italic: bool,
265    #[serde(default = "bool::default")]
266    pub strikethrough: bool,
267    #[serde(default = "bool::default")]
268    pub underline: bool,
269    #[serde(default = "bool::default")]
270    pub code: bool,
271    #[serde(default = "String::new")]
272    pub color: String,
273}
274
275impl Default for AnnotationObject {
276    fn default() -> Self {
277        let annotation = AnnotationObject {
278            bold: false,
279            italic: false,
280            strikethrough: false,
281            underline: false,
282            code: false,
283            color: "default".to_string(),
284        };
285        return annotation;
286    }
287}
288
289#[derive(Debug, Clone, Serialize, Deserialize)]
290pub struct RichText {
291    #[serde(rename = "type", default = "String::new")]
292    pub type_name: String,
293    #[serde(default = "TextObject::default")]
294    pub text: TextObject,
295    #[serde(default = "AnnotationObject::default")]
296    pub annotations: AnnotationObject,
297    #[serde(default = "String::new")]
298    pub plain_text: String,
299    #[serde(default = "Option::default")]
300    pub href: Option<String>,
301}
302
303impl Default for RichText {
304    fn default() -> Self {
305        let mut text = TextObject::default();
306        text.content = "".to_string();
307        let annotations = AnnotationObject::default();
308        let rich_text = RichText {
309            type_name: "text".to_string(),
310            text,
311            annotations,
312            plain_text: "".to_string(),
313            href: None,
314        };
315        return rich_text;
316    }
317}
318
319impl RichText {
320    pub fn from_str(value: String) -> Self {
321        let mut text = TextObject::default();
322        text.content = value.to_string();
323        let annotations = AnnotationObject::default();
324        let mut rich_text = RichText::default();
325        rich_text.type_name = "text".to_string();
326        rich_text.text = text;
327        rich_text.annotations = annotations;
328        rich_text.plain_text = value.to_string();
329        return rich_text;
330    }
331
332    pub fn from_str_with_annotations(
333        value: String,
334        bold: bool,
335        italic: bool,
336        underline: bool,
337        strikethrough: bool,
338        code: bool,
339        color: String,
340    ) -> Self {
341        let mut text = TextObject::default();
342        text.content = value.to_string();
343        let annotations = AnnotationObject {
344            bold,
345            italic,
346            underline,
347            strikethrough,
348            code,
349            color,
350        };
351        let mut rich_text = RichText::default();
352        rich_text.text = text;
353        rich_text.annotations = annotations;
354        return rich_text;
355    }
356}