notion_tools/structs/
query_filter.rs

1//! # Query Filter
2//!
3//! ## Build a query filter
4//!
5//! ### Simple filter
6//! A simple filter is a filter that has only one condition, `Status=="ToDo"`.
7//!
8//! ```rust
9//! # fn main() {
10//! # use notion_tools::structs::query_filter::*;
11//! let mut query_filter = QueryFilter::new();
12//! query_filter.args(FilterItem::status(String::from("Status"), StatusFilterItem::equals(String::from("ToDo"))));
13//! let filter = query_filter.build();
14//! # }
15//! ```
16//!
17//! ### Use `and` and `or` to combine multiple filters
18//!
19//! ```rust
20//! # fn main() {
21//! # use notion_tools::structs::query_filter::*;
22//! let mut query_filter = QueryFilter::new();
23//! query_filter.and(vec![
24//!    FilterItem::status(String::from("Status"), StatusFilterItem::equals(String::from("Active"))),
25//!    FilterItem::rich_text(String::from("Name"), RichTextFilterItem::contains(String::from("Zack"))),
26//!    FilterItem::or(vec![
27//!       FilterItem::number(String::from("Age"), NumberFilterItem::greater_than(18)),
28//!       FilterItem::rich_text(String::from("Address"), RichTextFilterItem::contains(String::from("New York"))),
29//!    ])
30//! ]);
31//! let filter = query_filter.build();
32//! # }
33//! ```
34//!
35//! ### Pagenation
36//!
37//! ```rust
38//! # use notion_tools::Notion;
39//! # use notion_tools::structs::query_filter::{QueryFilter, StatusFilterItem, FilterItem};
40//! # #[tokio::main]
41//! # async fn main() {
42//! let notion = Notion::new();
43//! let mut filter = QueryFilter::new();
44//! filter.args(FilterItem::status(
45//!     String::from("Status"),
46//!     StatusFilterItem::is_not_empty(),
47//! ));
48//!
49//! let mut has_more = true;
50//!
51//! while has_more {
52//!     let response = notion.query_database(filter.clone()).await;
53//!
54//!     match response {
55//!         Ok(response) => {
56//!             has_more = response.has_more.unwrap_or(false);
57//!             filter.start_cursor = response.next_cursor.unwrap_or(String::new());
58//!             for result in response.results {
59//!                // Do something with the result
60//!             }
61//!         }
62//!         Err(e) => {
63//!             println!("{:?}", e);
64//!         }
65//!     }
66//!     # has_more = false;
67//! }
68//! # }
69//! ```
70//!
71use serde::{Deserialize, Serialize};
72
73#[derive(Debug, Clone, Serialize, Deserialize, Default)]
74pub struct CheckboxFilterItem {
75    #[serde(default = "Option::default", skip_serializing_if = "Option::is_none")]
76    pub equals: Option<bool>,
77    #[serde(default = "Option::default", skip_serializing_if = "Option::is_none")]
78    pub does_not_equal: Option<bool>,
79}
80
81impl CheckboxFilterItem {
82    pub fn equals() -> Self {
83        CheckboxFilterItem {
84            equals: Some(true),
85            ..Default::default()
86        }
87    }
88
89    pub fn does_not_equal() -> Self {
90        CheckboxFilterItem {
91            does_not_equal: Some(true),
92            ..Default::default()
93        }
94    }
95}
96
97#[derive(Debug, Clone, Serialize, Deserialize, Default)]
98pub struct DateFilterItem {
99    #[serde(default = "Option::default", skip_serializing_if = "Option::is_none")]
100    pub after: Option<String>,
101    #[serde(default = "Option::default", skip_serializing_if = "Option::is_none")]
102    pub before: Option<String>,
103    #[serde(default = "Option::default", skip_serializing_if = "Option::is_none")]
104    pub equals: Option<String>,
105    #[serde(default = "Option::default", skip_serializing_if = "Option::is_none")]
106    pub is_empty: Option<bool>,
107    #[serde(default = "Option::default", skip_serializing_if = "Option::is_none")]
108    pub is_not_empty: Option<bool>,
109    #[serde(default = "Option::default", skip_serializing_if = "Option::is_none")]
110    pub on_or_after: Option<String>,
111    #[serde(default = "Option::default", skip_serializing_if = "Option::is_none")]
112    pub on_or_before: Option<String>,
113}
114
115impl DateFilterItem {
116    pub fn equals(value: String) -> Self {
117        DateFilterItem {
118            equals: Some(value.to_string()),
119            ..Default::default()
120        }
121    }
122
123    pub fn after(value: String) -> Self {
124        DateFilterItem {
125            after: Some(value.to_string()),
126            ..Default::default()
127        }
128    }
129
130    pub fn before(value: String) -> Self {
131        DateFilterItem {
132            before: Some(value.to_string()),
133            ..Default::default()
134        }
135    }
136
137    pub fn is_empty() -> Self {
138        DateFilterItem {
139            is_empty: Some(true),
140            ..Default::default()
141        }
142    }
143
144    pub fn is_not_empty() -> Self {
145        DateFilterItem {
146            is_not_empty: Some(true),
147            ..Default::default()
148        }
149    }
150
151    pub fn on_or_after(value: String) -> Self {
152        DateFilterItem {
153            on_or_after: Some(value.to_string()),
154            ..Default::default()
155        }
156    }
157
158    pub fn on_or_before(value: String) -> Self {
159        DateFilterItem {
160            on_or_before: Some(value.to_string()),
161            ..Default::default()
162        }
163    }
164}
165
166#[derive(Debug, Clone, Serialize, Deserialize, Default)]
167pub struct FilesFilterItem {
168    #[serde(default = "Option::default", skip_serializing_if = "Option::is_none")]
169    pub is_empty: Option<bool>,
170    #[serde(default = "Option::default", skip_serializing_if = "Option::is_none")]
171    pub is_not_empty: Option<bool>,
172}
173
174impl FilesFilterItem {
175    pub fn is_empty() -> Self {
176        FilesFilterItem {
177            is_empty: Some(true),
178            ..Default::default()
179        }
180    }
181
182    pub fn is_not_empty() -> Self {
183        FilesFilterItem {
184            is_not_empty: Some(true),
185            ..Default::default()
186        }
187    }
188}
189
190#[derive(Debug, Clone, Serialize, Deserialize, Default)]
191pub struct FormulaFilterItem {
192    #[serde(default = "Option::default", skip_serializing_if = "Option::is_none")]
193    pub checkbox: Option<CheckboxFilterItem>,
194    #[serde(default = "Option::default", skip_serializing_if = "Option::is_none")]
195    pub date: Option<DateFilterItem>,
196    #[serde(default = "Option::default", skip_serializing_if = "Option::is_none")]
197    pub number: Option<NumberFilterItem>,
198    #[serde(default = "Option::default", skip_serializing_if = "Option::is_none")]
199    pub string: Option<RichTextFilterItem>,
200}
201
202impl FormulaFilterItem {
203    pub fn checkbox(item: CheckboxFilterItem) -> Self {
204        FormulaFilterItem {
205            checkbox: Some(item),
206            ..Default::default()
207        }
208    }
209
210    pub fn date(item: DateFilterItem) -> Self {
211        FormulaFilterItem {
212            date: Some(item),
213            ..Default::default()
214        }
215    }
216
217    pub fn number(item: NumberFilterItem) -> Self {
218        FormulaFilterItem {
219            number: Some(item),
220            ..Default::default()
221        }
222    }
223
224    pub fn string(item: RichTextFilterItem) -> Self {
225        FormulaFilterItem {
226            string: Some(item),
227            ..Default::default()
228        }
229    }
230}
231
232#[derive(Debug, Clone, Serialize, Deserialize, Default)]
233pub struct MultiSelectFilterItem {
234    #[serde(default = "Option::default", skip_serializing_if = "Option::is_none")]
235    pub contains: Option<String>,
236    #[serde(default = "Option::default", skip_serializing_if = "Option::is_none")]
237    pub does_not_contain: Option<String>,
238    #[serde(default = "Option::default", skip_serializing_if = "Option::is_none")]
239    pub equals: Option<bool>,
240    #[serde(default = "Option::default", skip_serializing_if = "Option::is_none")]
241    pub does_not_equal: Option<bool>,
242}
243
244impl MultiSelectFilterItem {
245    pub fn contains(value: String) -> Self {
246        MultiSelectFilterItem {
247            contains: Some(value.to_string()),
248            ..Default::default()
249        }
250    }
251
252    pub fn does_not_contain(value: String) -> Self {
253        MultiSelectFilterItem {
254            does_not_contain: Some(value.to_string()),
255            ..Default::default()
256        }
257    }
258
259    pub fn equals() -> Self {
260        MultiSelectFilterItem {
261            equals: Some(true),
262            ..Default::default()
263        }
264    }
265
266    pub fn does_not_equal() -> Self {
267        MultiSelectFilterItem {
268            does_not_equal: Some(true),
269            ..Default::default()
270        }
271    }
272}
273
274#[derive(Debug, Clone, Serialize, Deserialize, Default)]
275pub struct NumberFilterItem {
276    #[serde(default = "Option::default", skip_serializing_if = "Option::is_none")]
277    pub equals: Option<u128>,
278    #[serde(default = "Option::default", skip_serializing_if = "Option::is_none")]
279    pub does_not_equal: Option<u128>,
280    #[serde(default = "Option::default", skip_serializing_if = "Option::is_none")]
281    pub greater_than: Option<u128>,
282    #[serde(default = "Option::default", skip_serializing_if = "Option::is_none")]
283    pub less_than: Option<u128>,
284    #[serde(default = "Option::default", skip_serializing_if = "Option::is_none")]
285    pub greater_than_or_equal_to: Option<u128>,
286    #[serde(default = "Option::default", skip_serializing_if = "Option::is_none")]
287    pub less_than_or_equal_to: Option<u128>,
288    #[serde(default = "Option::default", skip_serializing_if = "Option::is_none")]
289    pub is_empty: Option<bool>,
290    #[serde(default = "Option::default", skip_serializing_if = "Option::is_none")]
291    pub is_not_empty: Option<bool>,
292}
293
294impl NumberFilterItem {
295    pub fn equals(value: u128) -> Self {
296        NumberFilterItem {
297            equals: Some(value),
298            ..Default::default()
299        }
300    }
301
302    pub fn does_not_equal(value: u128) -> Self {
303        NumberFilterItem {
304            does_not_equal: Some(value),
305            ..Default::default()
306        }
307    }
308
309    pub fn greater_than(value: u128) -> Self {
310        NumberFilterItem {
311            greater_than: Some(value),
312            ..Default::default()
313        }
314    }
315
316    pub fn less_than(value: u128) -> Self {
317        NumberFilterItem {
318            less_than: Some(value),
319            ..Default::default()
320        }
321    }
322
323    pub fn greater_than_or_equal_to(value: u128) -> Self {
324        NumberFilterItem {
325            greater_than_or_equal_to: Some(value),
326            ..Default::default()
327        }
328    }
329
330    pub fn less_than_or_equal_to(value: u128) -> Self {
331        NumberFilterItem {
332            less_than_or_equal_to: Some(value),
333            ..Default::default()
334        }
335    }
336
337    pub fn is_empty() -> Self {
338        NumberFilterItem {
339            is_empty: Some(true),
340            ..Default::default()
341        }
342    }
343
344    pub fn is_not_empty() -> Self {
345        NumberFilterItem {
346            is_not_empty: Some(true),
347            ..Default::default()
348        }
349    }
350}
351
352#[derive(Debug, Clone, Serialize, Deserialize, Default)]
353pub struct PeopleFilterItem {
354    #[serde(default = "Option::default", skip_serializing_if = "Option::is_none")]
355    pub contains: Option<String>,
356    #[serde(default = "Option::default", skip_serializing_if = "Option::is_none")]
357    pub does_not_contain: Option<String>,
358    #[serde(default = "Option::default", skip_serializing_if = "Option::is_none")]
359    pub is_empty: Option<bool>,
360    #[serde(default = "Option::default", skip_serializing_if = "Option::is_none")]
361    pub is_not_empty: Option<bool>,
362}
363
364impl PeopleFilterItem {
365    pub fn contains(value: String) -> Self {
366        PeopleFilterItem {
367            contains: Some(value.to_string()),
368            ..Default::default()
369        }
370    }
371
372    pub fn does_not_contain(value: String) -> Self {
373        PeopleFilterItem {
374            does_not_contain: Some(value.to_string()),
375            ..Default::default()
376        }
377    }
378
379    pub fn is_empty() -> Self {
380        PeopleFilterItem {
381            is_empty: Some(true),
382            ..Default::default()
383        }
384    }
385
386    pub fn is_not_empty() -> Self {
387        PeopleFilterItem {
388            is_not_empty: Some(true),
389            ..Default::default()
390        }
391    }
392}
393
394#[derive(Debug, Clone, Serialize, Deserialize, Default)]
395pub struct RelationFilterItem {
396    #[serde(default = "Option::default", skip_serializing_if = "Option::is_none")]
397    pub contains: Option<String>,
398    #[serde(default = "Option::default", skip_serializing_if = "Option::is_none")]
399    pub does_not_contain: Option<String>,
400    #[serde(default = "Option::default", skip_serializing_if = "Option::is_none")]
401    pub is_empty: Option<bool>,
402    #[serde(default = "Option::default", skip_serializing_if = "Option::is_none")]
403    pub is_not_empty: Option<bool>,
404}
405
406impl RelationFilterItem {
407    pub fn contains(value: String) -> Self {
408        RelationFilterItem {
409            contains: Some(value.to_string()),
410            ..Default::default()
411        }
412    }
413
414    pub fn does_not_contain(value: String) -> Self {
415        RelationFilterItem {
416            does_not_contain: Some(value.to_string()),
417            ..Default::default()
418        }
419    }
420
421    pub fn is_empty() -> Self {
422        RelationFilterItem {
423            is_empty: Some(true),
424            ..Default::default()
425        }
426    }
427
428    pub fn is_not_empty() -> Self {
429        RelationFilterItem {
430            is_not_empty: Some(true),
431            ..Default::default()
432        }
433    }
434}
435
436#[derive(Debug, Clone, Serialize, Deserialize, Default)]
437pub struct RichTextFilterItem {
438    #[serde(default = "Option::default", skip_serializing_if = "Option::is_none")]
439    pub contains: Option<String>,
440    #[serde(default = "Option::default", skip_serializing_if = "Option::is_none")]
441    pub does_not_contain: Option<String>,
442    #[serde(default = "Option::default", skip_serializing_if = "Option::is_none")]
443    pub equals: Option<String>,
444    #[serde(default = "Option::default", skip_serializing_if = "Option::is_none")]
445    pub does_not_equal: Option<String>,
446    #[serde(default = "Option::default", skip_serializing_if = "Option::is_none")]
447    pub starts_with: Option<String>,
448    #[serde(default = "Option::default", skip_serializing_if = "Option::is_none")]
449    pub ends_with: Option<String>,
450    #[serde(default = "Option::default", skip_serializing_if = "Option::is_none")]
451    pub is_empty: Option<bool>,
452    #[serde(default = "Option::default", skip_serializing_if = "Option::is_none")]
453    pub is_not_empty: Option<bool>,
454}
455
456impl RichTextFilterItem {
457    pub fn contains(value: String) -> Self {
458        RichTextFilterItem {
459            contains: Some(value.to_string()),
460            ..Default::default()
461        }
462    }
463
464    pub fn does_not_contain(value: String) -> Self {
465        RichTextFilterItem {
466            does_not_contain: Some(value.to_string()),
467            ..Default::default()
468        }
469    }
470
471    pub fn equals(value: String) -> Self {
472        RichTextFilterItem {
473            equals: Some(value.to_string()),
474            ..Default::default()
475        }
476    }
477
478    pub fn does_not_equal(value: String) -> Self {
479        RichTextFilterItem {
480            does_not_equal: Some(value.to_string()),
481            ..Default::default()
482        }
483    }
484
485    pub fn starts_with(value: String) -> Self {
486        RichTextFilterItem {
487            starts_with: Some(value.to_string()),
488            ..Default::default()
489        }
490    }
491
492    pub fn ends_with(value: String) -> Self {
493        RichTextFilterItem {
494            ends_with: Some(value.to_string()),
495            ..Default::default()
496        }
497    }
498
499    pub fn is_empty() -> Self {
500        RichTextFilterItem {
501            is_empty: Some(true),
502            ..Default::default()
503        }
504    }
505
506    pub fn is_not_empty() -> Self {
507        RichTextFilterItem {
508            is_not_empty: Some(true),
509            ..Default::default()
510        }
511    }
512}
513
514#[derive(Debug, Clone, Serialize, Deserialize, Default)]
515pub struct SelectFilterItem {
516    #[serde(default = "Option::default", skip_serializing_if = "Option::is_none")]
517    pub equals: Option<String>,
518    #[serde(default = "Option::default", skip_serializing_if = "Option::is_none")]
519    pub does_not_equals: Option<String>,
520    #[serde(default = "Option::default", skip_serializing_if = "Option::is_none")]
521    pub is_empty: Option<bool>,
522    #[serde(default = "Option::default", skip_serializing_if = "Option::is_none")]
523    pub is_not_empty: Option<bool>,
524}
525
526impl SelectFilterItem {
527    pub fn equals(value: String) -> Self {
528        SelectFilterItem {
529            equals: Some(value.to_string()),
530            ..Default::default()
531        }
532    }
533
534    pub fn does_not_equals(value: String) -> Self {
535        SelectFilterItem {
536            does_not_equals: Some(value.to_string()),
537            ..Default::default()
538        }
539    }
540
541    pub fn is_empty() -> Self {
542        SelectFilterItem {
543            is_empty: Some(true),
544            ..Default::default()
545        }
546    }
547
548    pub fn is_not_empty() -> Self {
549        SelectFilterItem {
550            is_not_empty: Some(true),
551            ..Default::default()
552        }
553    }
554}
555
556#[derive(Debug, Clone, Serialize, Deserialize, Default)]
557pub struct StatusFilterItem {
558    #[serde(default = "Option::default", skip_serializing_if = "Option::is_none")]
559    pub equals: Option<String>,
560    #[serde(default = "Option::default", skip_serializing_if = "Option::is_none")]
561    pub does_not_equals: Option<String>,
562    #[serde(default = "Option::default", skip_serializing_if = "Option::is_none")]
563    pub is_empty: Option<bool>,
564    #[serde(default = "Option::default", skip_serializing_if = "Option::is_none")]
565    pub is_not_empty: Option<bool>,
566}
567
568impl StatusFilterItem {
569    pub fn equals(value: String) -> Self {
570        StatusFilterItem {
571            equals: Some(value.to_string()),
572            ..Default::default()
573        }
574    }
575
576    pub fn does_not_equals(value: String) -> Self {
577        StatusFilterItem {
578            does_not_equals: Some(value.to_string()),
579            ..Default::default()
580        }
581    }
582
583    pub fn is_empty() -> Self {
584        StatusFilterItem {
585            is_empty: Some(true),
586            ..Default::default()
587        }
588    }
589
590    pub fn is_not_empty() -> Self {
591        StatusFilterItem {
592            is_not_empty: Some(true),
593            ..Default::default()
594        }
595    }
596}
597
598#[derive(Debug, Clone, Serialize, Deserialize, Default)]
599pub struct TimestampFilterItem {
600    #[serde(default = "Option::default", skip_serializing_if = "Option::is_none")]
601    pub timestamp: Option<String>,
602    #[serde(default = "Option::default", skip_serializing_if = "Option::is_none")]
603    pub created_time: Option<DateFilterItem>,
604    #[serde(default = "Option::default", skip_serializing_if = "Option::is_none")]
605    pub last_edited_time: Option<DateFilterItem>,
606}
607
608impl TimestampFilterItem {
609    pub fn timestamp(value: String) -> Self {
610        TimestampFilterItem {
611            timestamp: Some(value.to_string()),
612            ..Default::default()
613        }
614    }
615
616    pub fn created_time(item: DateFilterItem) -> Self {
617        TimestampFilterItem {
618            created_time: Some(item),
619            ..Default::default()
620        }
621    }
622
623    pub fn last_edited_time(item: DateFilterItem) -> Self {
624        TimestampFilterItem {
625            last_edited_time: Some(item),
626            ..Default::default()
627        }
628    }
629}
630
631#[derive(Debug, Clone, Serialize, Deserialize, Default)]
632pub struct IdFilterItem {
633    #[serde(default = "Option::default", skip_serializing_if = "Option::is_none")]
634    pub equals: Option<u128>,
635    #[serde(default = "Option::default", skip_serializing_if = "Option::is_none")]
636    pub does_not_equal: Option<u128>,
637    #[serde(default = "Option::default", skip_serializing_if = "Option::is_none")]
638    pub greater_than: Option<u128>,
639    #[serde(default = "Option::default", skip_serializing_if = "Option::is_none")]
640    pub less_than: Option<u128>,
641    #[serde(default = "Option::default", skip_serializing_if = "Option::is_none")]
642    pub greater_than_or_equal_to: Option<u128>,
643    #[serde(default = "Option::default", skip_serializing_if = "Option::is_none")]
644    pub less_than_or_equal_to: Option<u128>,
645}
646
647impl IdFilterItem {
648    pub fn equals(value: u128) -> Self {
649        IdFilterItem {
650            equals: Some(value),
651            ..Default::default()
652        }
653    }
654
655    pub fn does_not_equal(value: u128) -> Self {
656        IdFilterItem {
657            does_not_equal: Some(value),
658            ..Default::default()
659        }
660    }
661
662    pub fn greater_than(value: u128) -> Self {
663        IdFilterItem {
664            greater_than: Some(value),
665            ..Default::default()
666        }
667    }
668
669    pub fn less_than(value: u128) -> Self {
670        IdFilterItem {
671            less_than: Some(value),
672            ..Default::default()
673        }
674    }
675
676    pub fn greater_than_or_equal_to(value: u128) -> Self {
677        IdFilterItem {
678            greater_than_or_equal_to: Some(value),
679            ..Default::default()
680        }
681    }
682
683    pub fn less_than_or_equal_to(value: u128) -> Self {
684        IdFilterItem {
685            less_than_or_equal_to: Some(value),
686            ..Default::default()
687        }
688    }
689}
690
691#[derive(Debug, Clone, Serialize, Deserialize, Default)]
692pub struct FilterItem {
693    #[serde(default = "String::new", skip_serializing_if = "String::is_empty")]
694    pub property: String,
695    #[serde(default = "Option::default", skip_serializing_if = "Option::is_none")]
696    pub and: Option<Vec<FilterItem>>,
697    #[serde(default = "Option::default", skip_serializing_if = "Option::is_none")]
698    pub or: Option<Vec<FilterItem>>,
699    #[serde(default = "Option::default", skip_serializing_if = "Option::is_none")]
700    pub checkbox: Option<CheckboxFilterItem>,
701    #[serde(default = "Option::default", skip_serializing_if = "Option::is_none")]
702    pub date: Option<DateFilterItem>,
703    #[serde(default = "Option::default", skip_serializing_if = "Option::is_none")]
704    pub files: Option<FilesFilterItem>,
705    #[serde(default = "Option::default", skip_serializing_if = "Option::is_none")]
706    pub formula: Option<FormulaFilterItem>,
707    #[serde(default = "Option::default", skip_serializing_if = "Option::is_none")]
708    pub multi_select: Option<MultiSelectFilterItem>,
709    #[serde(default = "Option::default", skip_serializing_if = "Option::is_none")]
710    pub number: Option<NumberFilterItem>,
711    #[serde(default = "Option::default", skip_serializing_if = "Option::is_none")]
712    pub people: Option<PeopleFilterItem>,
713    #[serde(default = "Option::default", skip_serializing_if = "Option::is_none")]
714    pub relation: Option<RelationFilterItem>,
715    #[serde(default = "Option::default", skip_serializing_if = "Option::is_none")]
716    pub rich_text: Option<RichTextFilterItem>,
717    #[serde(default = "Option::default", skip_serializing_if = "Option::is_none")]
718    pub select: Option<SelectFilterItem>,
719    #[serde(default = "Option::default", skip_serializing_if = "Option::is_none")]
720    pub status: Option<StatusFilterItem>,
721    #[serde(default = "Option::default", skip_serializing_if = "Option::is_none")]
722    pub timestamp: Option<TimestampFilterItem>,
723    #[serde(default = "Option::default", skip_serializing_if = "Option::is_none")]
724    pub id: Option<IdFilterItem>,
725}
726
727impl FilterItem {
728    pub fn and(items: Vec<FilterItem>) -> Self {
729        FilterItem {
730            and: Some(items),
731            ..Default::default()
732        }
733    }
734
735    pub fn or(items: Vec<FilterItem>) -> Self {
736        FilterItem {
737            or: Some(items),
738            ..Default::default()
739        }
740    }
741
742    pub fn checkbox(property: String, item: CheckboxFilterItem) -> Self {
743        FilterItem {
744            property: property.to_string(),
745            checkbox: Some(item),
746            ..Default::default()
747        }
748    }
749
750    pub fn date(property: String, item: DateFilterItem) -> Self {
751        FilterItem {
752            property: property.to_string(),
753            date: Some(item),
754            ..Default::default()
755        }
756    }
757
758    pub fn files(property: String, item: FilesFilterItem) -> Self {
759        FilterItem {
760            property: property.to_string(),
761            files: Some(item),
762            ..Default::default()
763        }
764    }
765
766    pub fn formula(property: String, item: FormulaFilterItem) -> Self {
767        FilterItem {
768            property: property.to_string(),
769            formula: Some(item),
770            ..Default::default()
771        }
772    }
773
774    pub fn multi_select(property: String, item: MultiSelectFilterItem) -> Self {
775        FilterItem {
776            property: property.to_string(),
777            multi_select: Some(item),
778            ..Default::default()
779        }
780    }
781
782    pub fn number(property: String, item: NumberFilterItem) -> Self {
783        FilterItem {
784            property: property.to_string(),
785            number: Some(item),
786            ..Default::default()
787        }
788    }
789
790    pub fn people(property: String, item: PeopleFilterItem) -> Self {
791        FilterItem {
792            property: property.to_string(),
793            people: Some(item),
794            ..Default::default()
795        }
796    }
797
798    pub fn relation(property: String, item: RelationFilterItem) -> Self {
799        FilterItem {
800            property: property.to_string(),
801            relation: Some(item),
802            ..Default::default()
803        }
804    }
805
806    pub fn rich_text(property: String, item: RichTextFilterItem) -> Self {
807        FilterItem {
808            property: property.to_string(),
809            rich_text: Some(item),
810            ..Default::default()
811        }
812    }
813
814    pub fn select(property: String, item: SelectFilterItem) -> Self {
815        FilterItem {
816            property: property.to_string(),
817            select: Some(item),
818            ..Default::default()
819        }
820    }
821
822    pub fn status(property: String, item: StatusFilterItem) -> Self {
823        FilterItem {
824            property: property.to_string(),
825            status: Some(item),
826            ..Default::default()
827        }
828    }
829
830    pub fn timestamp(property: String, item: TimestampFilterItem) -> Self {
831        FilterItem {
832            property: property.to_string(),
833            timestamp: Some(item),
834            ..Default::default()
835        }
836    }
837
838    pub fn id(property: String, item: IdFilterItem) -> Self {
839        FilterItem {
840            property: property.to_string(),
841            id: Some(item),
842            ..Default::default()
843        }
844    }
845}
846
847#[derive(Debug, Clone, Serialize, Deserialize)]
848pub struct QueryFilter {
849    pub filter: FilterItem,
850    #[serde(default = "String::new", skip_serializing_if = "String::is_empty")]
851    pub start_cursor: String,
852}
853
854impl QueryFilter {
855    pub fn new() -> Self {
856        QueryFilter {
857            filter: FilterItem::default(),
858            start_cursor: String::new(),
859        }
860    }
861
862    pub fn args(&mut self, item: FilterItem) {
863        self.filter = item;
864    }
865
866    pub fn and(&mut self, items: Vec<FilterItem>) {
867        self.filter.and = Some(items);
868    }
869
870    pub fn or(&mut self, items: Vec<FilterItem>) {
871        self.filter.or = Some(items);
872    }
873
874    pub fn build(&self) -> String {
875        serde_json::to_string(self).unwrap()
876    }
877}