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