1use chrono::NaiveDate;
2
3#[derive(Debug, Clone, PartialEq)]
4pub enum QueryNode {
5 Text(String),
6 Phrase(String),
7 Field { field: QueryField, value: String },
8 Filter(FilterKind),
9 Label(String),
10 DateRange { bound: DateBound, date: DateValue },
11 Size { op: SizeOp, bytes: u64 },
12 And(Box<QueryNode>, Box<QueryNode>),
13 Or(Box<QueryNode>, Box<QueryNode>),
14 Not(Box<QueryNode>),
15}
16
17#[derive(Debug, Clone, PartialEq)]
18pub enum QueryField {
19 From,
20 To,
21 Cc,
22 Bcc,
23 Subject,
24 Body,
25 Filename,
26}
27
28#[derive(Debug, Clone, PartialEq)]
29pub enum FilterKind {
30 Unread,
31 Read,
32 Starred,
33 Draft,
34 Sent,
35 Trash,
36 Spam,
37 Answered,
38 Inbox,
39 Archived,
40 HasAttachment,
41}
42
43#[derive(Debug, Clone, PartialEq)]
44pub enum DateBound {
45 After,
46 Before,
47 Exact,
48}
49
50#[derive(Debug, Clone, PartialEq)]
51pub enum DateValue {
52 Specific(NaiveDate),
53 Today,
54 Yesterday,
55 ThisWeek,
56 ThisMonth,
57}
58
59#[derive(Debug, Clone, PartialEq)]
60pub enum SizeOp {
61 LessThan,
62 LessThanOrEqual,
63 Equal,
64 GreaterThan,
65 GreaterThanOrEqual,
66}