use std::fmt::Display;
#[derive(Debug, PartialEq, Eq, Copy, Clone, Hash)]
pub enum Operator {
LessThan,
LessThanEqual,
GreaterThan,
GreaterThanEqual,
NotEqual,
Exact,
Equal,
Exists,
}
impl Display for Operator {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
f.write_str(self.symbol())
}
}
impl Operator {
pub fn symbol(&self) -> &'static str {
match self {
Operator::LessThan => "<",
Operator::LessThanEqual => "<=",
Operator::GreaterThan => ">",
Operator::GreaterThanEqual => ">=",
Operator::Exact => "==",
Operator::Equal => "=",
Operator::NotEqual => "!=",
Operator::Exists => "?=",
}
}
pub fn name(&self) -> &'static str {
match self {
Operator::LessThan => "LESS_THAN",
Operator::LessThanEqual => "LESS_THAN_EQUAL",
Operator::GreaterThan => "GREATER_THAN",
Operator::GreaterThanEqual => "GREATER_THAN_EQUAL",
Operator::Exact => "EXACT",
Operator::Equal => "EQUAL",
Operator::NotEqual => "NOT_EQUAL",
Operator::Exists => "EXISTS",
}
}
}
#[cfg(feature = "serde")]
impl<'de> serde::Deserialize<'de> for Operator {
fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
where
D: serde::Deserializer<'de>,
{
struct OperatorVisitor;
impl<'de> serde::de::Visitor<'de> for OperatorVisitor {
type Value = Operator;
fn expecting(&self, formatter: &mut std::fmt::Formatter) -> std::fmt::Result {
formatter.write_str("an operator")
}
fn visit_borrowed_str<E>(self, v: &'de str) -> Result<Self::Value, E>
where
E: serde::de::Error,
{
match v {
"<" => Ok(Operator::LessThan),
"<=" => Ok(Operator::LessThanEqual),
">" => Ok(Operator::GreaterThan),
">=" => Ok(Operator::GreaterThanEqual),
"==" => Ok(Operator::Exact),
"=" => Ok(Operator::Equal),
"!=" => Ok(Operator::NotEqual),
"?=" => Ok(Operator::Exists),
_ => Err(E::custom("did not receive a known operator")),
}
}
}
deserializer.deserialize_str(OperatorVisitor)
}
}