#[macro_export]
macro_rules! expr_as {
($t:ty, $template:expr) => {
$crate::expression::core::Expression::<$t>::new($template, vec![])
};
($t:ty, $template:expr, $($param:tt),*) => {
$crate::expression::core::Expression::<$t>::new(
$template,
vec![
$(
$crate::expr_param!($param)
),*
]
)
};
}
#[macro_export]
macro_rules! expr_any {
($template:expr) => {
$crate::expression::core::Expression::new($template, vec![])
};
($template:expr, $($param:tt),*) => {
$crate::expression::core::Expression::new(
$template,
vec![
$(
$crate::expr_param!($param)
),*
]
)
};
}
#[macro_export]
macro_rules! expr {
($template:expr) => {
$crate::expr_as!(serde_json::Value, $template)
};
($template:expr, $($param:tt),*) => {
$crate::expr_as!(serde_json::Value, $template, $($param),*)
};
}
#[macro_export]
macro_rules! expr_param {
(($expr:expr)) => {
$crate::traits::expressive::ExpressiveEnum::Nested({
#[allow(unused_imports)]
use $crate::traits::expressive::Expressive;
$expr.expr()
})
};
({$deferred:expr}) => {
$deferred.into()
};
($param:expr) => {
$crate::traits::expressive::ExpressiveEnum::Scalar($param.into())
};
}
#[cfg(test)]
mod tests {
use crate::Expression;
#[test]
fn test_expr_macro() {
let expr = expr!("age > {}", 18);
assert_eq!(expr.template, "age > {}");
assert_eq!(expr.parameters.len(), 1);
}
#[test]
fn test_expr_as_macro() {
let expr = expr_as!(i32, "age > {}", 18);
assert_eq!(expr.template, "age > {}");
assert_eq!(expr.parameters.len(), 1);
}
#[test]
fn test_expr_any_macro() {
let expr: Expression<i16> = expr_any!("age > {}", 18i16);
assert_eq!(expr.template, "age > {}");
assert_eq!(expr.parameters.len(), 1);
}
#[test]
fn test_nested_expr() {
let inner = expr!("status = {}", "active");
let outer = expr!("WHERE {} AND age > {}", (inner), "21");
assert_eq!(outer.template, "WHERE {} AND age > {}");
assert_eq!(outer.parameters.len(), 2);
}
#[test]
fn test_preview() {
let expr = expr_as!(String, "Hello {}", "world");
assert_eq!(expr.preview(), "Hello world");
}
}