yozefu_lib/search/compare/
string.rs1use 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}