use chrono::NaiveDate;
#[derive(Debug, Clone, PartialEq, Eq)]
#[non_exhaustive]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub enum QueryNode {
Text(String),
Exact(String),
Phrase(String),
Field { field: QueryField, value: String },
Filter(FilterKind),
Label(String),
DateRange { bound: DateBound, date: DateValue },
Size { op: SizeOp, bytes: u64 },
Near {
left: String,
right: String,
distance: u32,
},
And(Box<QueryNode>, Box<QueryNode>),
Or(Box<QueryNode>, Box<QueryNode>),
Not(Box<QueryNode>),
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
#[non_exhaustive]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
#[cfg_attr(feature = "serde", serde(rename_all = "snake_case"))]
pub enum QueryField {
From,
To,
Cc,
Bcc,
Subject,
Body,
Filename,
List,
DeliveredTo,
Rfc822MsgId,
}
#[derive(Debug, Clone, PartialEq, Eq)]
#[non_exhaustive]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
#[cfg_attr(feature = "serde", serde(rename_all = "snake_case"))]
pub enum FilterKind {
Unread,
Read,
Starred,
Draft,
Sent,
Trash,
Spam,
Answered,
Inbox,
Archived,
Anywhere,
HasAttachment,
HasCalendar,
HasUserLabels,
NoUserLabels,
HasDrive,
HasDocument,
HasSpreadsheet,
HasPresentation,
HasYoutube,
HasInlineImage,
HasLink,
HasLinkHeavy,
NoLinks,
Custom(String),
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
#[non_exhaustive]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
#[cfg_attr(feature = "serde", serde(rename_all = "snake_case"))]
pub enum DateBound {
After,
Before,
Exact,
}
#[derive(Debug, Clone, PartialEq, Eq)]
#[non_exhaustive]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub enum DateValue {
Specific(NaiveDate),
Today,
Yesterday,
ThisWeek,
ThisMonth,
Relative {
amount: u32,
unit: RelativeUnit,
},
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
#[non_exhaustive]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
#[cfg_attr(feature = "serde", serde(rename_all = "snake_case"))]
pub enum RelativeUnit {
Day,
Week,
Month,
Year,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
#[non_exhaustive]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
#[cfg_attr(feature = "serde", serde(rename_all = "snake_case"))]
pub enum SizeOp {
LessThan,
LessThanOrEqual,
Equal,
GreaterThan,
GreaterThanOrEqual,
}