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#[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}