use crate::prelude::*;
#[cfg_attr(feature = "serde", derive(Deserialize, Serialize))]
#[derive(Debug)]
pub enum SearchCondition {
Predicate {
lhs: Expression,
comparison_operator: ComparisonOperator,
rhs: Expression,
},
Unknown,
}
impl Sql for SearchCondition {
fn sql(&self, s: String, ctx: &Context) -> Result<String> {
match self {
SearchCondition::Predicate {
lhs,
comparison_operator,
rhs,
} => {
let s = lhs.sql(s, ctx)?;
let s = comparison_operator.sql(s, ctx)?;
let s = rhs.sql(s, ctx);
s
}
SearchCondition::Unknown => Err(SqlGenError::ParseFailed(
"Was not able to parse the SearchCondition".into(),
)),
}
}
}
impl<T> From<T> for SearchCondition
where
T: AsRef<str>,
{
fn from(value: T) -> Self {
let split: Vec<&str> = value.as_ref().split(' ').collect();
match split[..] {
[lhs, operator, rhs] => SearchCondition::Predicate {
lhs: lhs.into(),
comparison_operator: operator.into(),
rhs: rhs.into(),
},
_ => SearchCondition::Unknown,
}
}
}