use vantage_expressions::{Expression, Expressive, ExpressiveEnum};
pub fn or_<T>(lhs: impl Expressive<T>, rhs: impl Expressive<T>) -> Expression<T> {
Expression::new(
"({}) OR ({})",
vec![
ExpressiveEnum::Nested(lhs.expr()),
ExpressiveEnum::Nested(rhs.expr()),
],
)
}
pub fn and_<T>(lhs: impl Expressive<T>, rhs: impl Expressive<T>) -> Expression<T> {
Expression::new(
"({}) AND ({})",
vec![
ExpressiveEnum::Nested(lhs.expr()),
ExpressiveEnum::Nested(rhs.expr()),
],
)
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_or_preview() {
let expr: Expression<i32> = or_(
Expression::new("a = {}", vec![ExpressiveEnum::Scalar(1)]),
Expression::new("b = {}", vec![ExpressiveEnum::Scalar(2)]),
);
assert_eq!(expr.preview(), "(a = 1) OR (b = 2)");
}
#[test]
fn test_and_preview() {
let expr: Expression<i32> = and_(
Expression::new("a = {}", vec![ExpressiveEnum::Scalar(1)]),
Expression::new("b = {}", vec![ExpressiveEnum::Scalar(2)]),
);
assert_eq!(expr.preview(), "(a = 1) AND (b = 2)");
}
#[test]
fn test_nested_or_and() {
let expr: Expression<i32> = or_(
and_(
Expression::new("a = {}", vec![ExpressiveEnum::Scalar(1)]),
Expression::new("b = {}", vec![ExpressiveEnum::Scalar(2)]),
),
Expression::new("c = {}", vec![ExpressiveEnum::Scalar(3)]),
);
assert_eq!(expr.preview(), "((a = 1) AND (b = 2)) OR (c = 3)");
}
}