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 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}