whereexpr 0.1.5

A fast, expressive rule-based filtering engine for Rust that evaluates boolean expressions over any data structure
Documentation
use crate::Operation;
use crate::Error;
use crate::{ValueKind, Value};
use super::single_string::*;
use super::string_contains_one_of::ContainsOneOf;
use super::string_starts_with_one_of::StartsWithOneOf;
use super::string_ends_with_one_of::EndsWithOneOf;
use super::string_is_one_of::IsOneOf;


#[derive(Debug)]
pub(crate) enum StringPredicate {
    StartsWith(StartsWith),
    EndsWith(EndsWith),
    Contains(Contains),
    Equals(Equals),
    ContainsOneOf(ContainsOneOf),
    StartsWithOneOf(StartsWithOneOf),
    EndsWithOneOf(EndsWithOneOf),
    IsOneOf(IsOneOf),
}

impl StringPredicate {
    #[inline(always)]
    pub(crate) fn evaluate(&self, value: &str) -> bool {
        match self {
            StringPredicate::StartsWith(predicate) => predicate.evaluate(value),
            StringPredicate::EndsWith(predicate) => predicate.evaluate(value),
            StringPredicate::Contains(predicate) => predicate.evaluate(value),
            StringPredicate::Equals(predicate) => predicate.evaluate(value),
            StringPredicate::ContainsOneOf(predicate) => predicate.evaluate(value),
            StringPredicate::StartsWithOneOf(predicate) => predicate.evaluate(value),
            StringPredicate::EndsWithOneOf(predicate) => predicate.evaluate(value),
            StringPredicate::IsOneOf(predicate) => predicate.evaluate(value),
        }
    }
    pub(crate) fn with_value(operation: Operation, value: &str, ignore_case: bool) -> Result<Self, Error> {
        match operation {
            Operation::StartsWith => Ok(StringPredicate::StartsWith(StartsWith::new(value, ignore_case))),
            Operation::EndsWith => Ok(StringPredicate::EndsWith(EndsWith::new(value, ignore_case))),
            Operation::Contains => Ok(StringPredicate::Contains(Contains::new(value, ignore_case))),
            Operation::Is => Ok(StringPredicate::Equals(Equals::new(value, ignore_case))),
            _ => Err(Error::InvalidOperationForValue(operation, ValueKind::String)),
        }
    }
    pub(crate) fn with_str_list(operation: Operation, values: &[&str], ignore_case: bool) -> Result<Self, Error> {
        match operation {
            Operation::ContainsOneOf => Ok(StringPredicate::ContainsOneOf(ContainsOneOf::with_str_list(values, ignore_case)?)),
            Operation::StartsWithOneOf => Ok(StringPredicate::StartsWithOneOf(StartsWithOneOf::with_str_list(values, ignore_case)?)),
            Operation::EndsWithOneOf => Ok(StringPredicate::EndsWithOneOf(EndsWithOneOf::with_str_list(values, ignore_case)?)),
            Operation::IsOneOf => Ok(StringPredicate::IsOneOf(IsOneOf::with_str_list(values, ignore_case)?)),
            _ => Err(Error::InvalidOperationForValue(operation, ValueKind::String)),
        }
    }

    pub(crate) fn with_value_list(operation: Operation, values: &[Value<'_>]) -> Result<Self, Error>
    {
        match operation  {
            Operation::ContainsOneOf => Ok(StringPredicate::ContainsOneOf(ContainsOneOf::with_value_list(values)?)),
            Operation::StartsWithOneOf => Ok(StringPredicate::StartsWithOneOf(StartsWithOneOf::with_value_list(values)?)),
            Operation::EndsWithOneOf => Ok(StringPredicate::EndsWithOneOf(EndsWithOneOf::with_value_list(values)?)),
            Operation::IsOneOf => Ok(StringPredicate::IsOneOf(IsOneOf::with_value_list(values)?)),
            _ => Err(Error::InvalidOperationForValue(operation, ValueKind::String)),
        }
    }    
}