yozefu_lib/search/compare/
string.rs

1use std::fmt::Display;
2
3#[cfg(feature = "native")]
4use crate::search::wsi::wsi;
5#[cfg(feature = "native")]
6use nom::{
7    branch::alt, bytes::complete::tag, bytes::complete::tag_no_case, combinator::value,
8    sequence::pair, IResult, Parser,
9};
10
11#[derive(Debug, PartialEq, Clone, Eq)]
12pub enum StringOperator {
13    Contain,
14    Equal,
15    NotEqual,
16    StartWith,
17}
18
19impl Display for StringOperator {
20    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
21        match self {
22            StringOperator::Contain => write!(f, "contains"),
23            StringOperator::Equal => write!(f, "=="),
24            StringOperator::NotEqual => write!(f, "!="),
25            StringOperator::StartWith => write!(f, "starts with"),
26        }
27    }
28}
29
30#[cfg(feature = "native")]
31pub fn parse_string_operator(input: &str) -> IResult<&str, StringOperator> {
32    alt((
33        value(StringOperator::Contain, wsi(alt((tag("~="), tag("=~"))))),
34        value(
35            StringOperator::Contain,
36            wsi(alt((
37                tag_no_case("contains"),
38                tag_no_case("c"),
39                tag_no_case("contain"),
40                tag_no_case("include"),
41                tag_no_case("includes"),
42            ))),
43        ),
44        value(
45            StringOperator::StartWith,
46            wsi(pair(
47                wsi(alt((tag_no_case("starts"), tag_no_case("start")))),
48                wsi(tag_no_case("with")),
49            )),
50        ),
51        value(StringOperator::Equal, wsi(tag("=="))),
52        value(StringOperator::NotEqual, wsi(tag("!="))),
53    ))
54    .parse(input)
55}