#![doc = include_str!("../../../examples/search_emails_query.rs")]
pub mod error;
pub mod filter;
pub mod parser;
pub mod sort;
use std::str::FromStr;
use error::Error;
use self::{filter::SearchEmailsFilterQuery, sort::SearchEmailsSortQuery};
#[derive(Clone, Debug, Eq, PartialEq, Ord, PartialOrd)]
pub struct SearchEmailsQuery {
pub filter: Option<SearchEmailsFilterQuery>,
pub sort: Option<SearchEmailsSortQuery>,
}
#[doc = include_str!("./filter/grammar.abnf")]
#[doc = include_str!("./sort/grammar.abnf")]
impl FromStr for SearchEmailsQuery {
type Err = Error;
fn from_str(s: &str) -> Result<Self, Self::Err> {
parser::parse(s)
}
}
#[cfg(test)]
mod tests {
use crate::search_query::{
filter::SearchEmailsFilterQuery,
sort::{SearchEmailsSorterKind::*, SearchEmailsSorterOrder::*},
SearchEmailsQuery,
};
#[test]
fn filters_only() {
assert_eq!(
"from f and to t".parse::<SearchEmailsQuery>().unwrap(),
SearchEmailsQuery {
filter: Some(SearchEmailsFilterQuery::And(
Box::new(SearchEmailsFilterQuery::From("f".into())),
Box::new(SearchEmailsFilterQuery::To("t".into()))
)),
sort: None,
},
);
}
#[test]
fn sorters_only() {
assert_eq!(
"order by from".parse::<SearchEmailsQuery>().unwrap(),
SearchEmailsQuery {
filter: None,
sort: Some(vec![From.into()])
},
);
assert_eq!(
"order by from asc subject desc"
.parse::<SearchEmailsQuery>()
.unwrap(),
SearchEmailsQuery {
filter: None,
sort: Some(vec![From.into(), (Subject, Descending).into()])
},
);
}
#[test]
fn full() {
assert_eq!(
"from f and to t order by from to desc"
.parse::<SearchEmailsQuery>()
.unwrap(),
SearchEmailsQuery {
filter: Some(SearchEmailsFilterQuery::And(
Box::new(SearchEmailsFilterQuery::From("f".into())),
Box::new(SearchEmailsFilterQuery::To("t".into()))
)),
sort: Some(vec![From.into(), (To, Descending).into()])
},
);
}
}