use super::Value;
#[derive(Debug, Clone)]
pub enum Expr {
Eq(String, Value),
Ne(String, Value),
Lt(String, Value),
Lte(String, Value),
Gt(String, Value),
Gte(String, Value),
Like(String, String),
ILike(String, String),
IsNull(String),
IsNotNull(String),
In(String, Vec<Value>),
And(Vec<Expr>),
Or(Vec<Expr>),
Not(Box<Expr>),
}
impl Expr {
pub fn eq(column: impl Into<String>, value: impl Into<Value>) -> Self {
Expr::Eq(column.into(), value.into())
}
pub fn ne(column: impl Into<String>, value: impl Into<Value>) -> Self {
Expr::Ne(column.into(), value.into())
}
pub fn lt(column: impl Into<String>, value: impl Into<Value>) -> Self {
Expr::Lt(column.into(), value.into())
}
pub fn lte(column: impl Into<String>, value: impl Into<Value>) -> Self {
Expr::Lte(column.into(), value.into())
}
pub fn gt(column: impl Into<String>, value: impl Into<Value>) -> Self {
Expr::Gt(column.into(), value.into())
}
pub fn gte(column: impl Into<String>, value: impl Into<Value>) -> Self {
Expr::Gte(column.into(), value.into())
}
pub fn like(column: impl Into<String>, pattern: impl Into<String>) -> Self {
Expr::Like(column.into(), pattern.into())
}
pub fn ilike(column: impl Into<String>, pattern: impl Into<String>) -> Self {
Expr::ILike(column.into(), pattern.into())
}
pub fn is_null(column: impl Into<String>) -> Self {
Expr::IsNull(column.into())
}
pub fn is_not_null(column: impl Into<String>) -> Self {
Expr::IsNotNull(column.into())
}
pub fn is_in(
column: impl Into<String>,
values: impl IntoIterator<Item = impl Into<Value>>,
) -> Self {
Expr::In(column.into(), values.into_iter().map(Into::into).collect())
}
pub fn and(exprs: impl IntoIterator<Item = Expr>) -> Self {
Expr::And(exprs.into_iter().collect())
}
pub fn or(exprs: impl IntoIterator<Item = Expr>) -> Self {
Expr::Or(exprs.into_iter().collect())
}
#[allow(clippy::should_implement_trait)]
pub fn not(expr: Expr) -> Self {
Expr::Not(Box::new(expr))
}
}