Function parse

Source
pub fn parse<'a>(
    input: impl AsRef<str> + 'a,
) -> Result<SearchEmailsQuery, Error>
Expand description

Parse the given string slice into a SearchEmailsQuery.

Because of the recursive nature of SearchEmailsFilterQuery, it is not possible to directly parse a full query from a string using chumsky. Instead the string is splitted in two, and filters and sorters are parsed separately.

A search emails query string can contain a filter query, a sorter query or both. In this last case, the filter query needs to be defined first, then the sorter query. They should be separated by the keyword "order by".

See filter::parser::query for more details on the filter query string API, and sort::parser::query for more details on the sort query API.

§Examples

use email::search_query::SearchEmailsQuery;
use std::str::FromStr;

pub fn main() {
    // filter only
    "subject foo and body bar".parse::<SearchEmailsQuery>().unwrap();

    // sort only
    "order by date desc".parse::<SearchEmailsQuery>().unwrap();

    // filter then sort
    "subject foo and body bar order by subject".parse::<SearchEmailsQuery>().unwrap();
}

§ABNF

query = filter-query / "order by" SP sort-query / filter-query SP "order by" SP sort-query
filter-query = filter *(SP filter)


filter =  "(" filter ")"
               ; nested filter

filter =/ and / or / not
               ; filter operators

filter =/ date / before-date / after-date / from / to / subject / body / flag
               ; filter conditions


and = filter SP "and" SP filter

or  = filter SP "or" SP filter

not = "not" SP filter


date        = "date" SP date-pattern

before-date = "before" SP date-pattern

after-date  = "before" SP date-pattern

from        = "from" SP text-pattern

to          = "to" SP text-pattern

subject     = "subject" SP text-pattern

body        = "body" SP text-pattern

flag        = "flag" SP text-pattern


date-pattern =  4DIGIT "-" 2DIGIT "-" 2DIGIT
                     ; date matching "YYYY-MM-dd" format

date-pattern =/ 4DIGIT "/" 2DIGIT "/" 2DIGIT
                     ; date matching "YYYY/MM/dd" format

date-pattern =/ 2DIGIT "-" 2DIGIT "-" 4DIGIT
                     ; date matching "dd-MM-YYYY" format

date-pattern =/ 2DIGIT "/" 2DIGIT "/" 4DIGIT
                     ; date matching "dd/MM/YYYY" format


text-pattern = DQUOTE *VCHAR DQUOTE

sort-query   = sorter *(SP sorter)

sorter       = sorter-kind [SP sorter-order]

sorter-kind  = "date" / "from" / "to" / "subject"

sorter-order = "asc" / "desc"