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    IResult, Parser, branch::alt, bytes::complete::tag, bytes::complete::tag_no_case,
8    combinator::value, sequence::pair,
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    use super::parse_equal;
33
34    alt((
35        value(StringOperator::Contain, wsi(alt((tag("~="), tag("=~"))))),
36        value(
37            StringOperator::Contain,
38            wsi(alt((
39                tag_no_case("contains"),
40                tag_no_case("c"),
41                tag_no_case("contain"),
42                tag_no_case("include"),
43                tag_no_case("includes"),
44            ))),
45        ),
46        value(
47            StringOperator::StartWith,
48            wsi(pair(
49                wsi(alt((tag_no_case("starts"), tag_no_case("start")))),
50                wsi(tag_no_case("with")),
51            )),
52        ),
53        value(StringOperator::Equal, parse_equal),
54        value(StringOperator::NotEqual, wsi(tag("!="))),
55    ))
56    .parse(input)
57}