vantage_expressions/expression/
macros.rs1#[macro_export]
8macro_rules! expr_as {
9 ($t:ty, $template:expr) => {
11 $crate::expression::core::Expression::<$t>::new($template, vec![])
12 };
13
14 ($t:ty, $template:expr, $($param:tt),*) => {
16 $crate::expression::core::Expression::<$t>::new(
17 $template,
18 vec![
19 $(
20 $crate::expr_param!($param)
21 ),*
22 ]
23 )
24 };
25}
26
27#[macro_export]
35macro_rules! expr_any {
36 ($template:expr) => {
38 $crate::expression::core::Expression::new($template, vec![])
39 };
40
41 ($template:expr, $($param:tt),*) => {
43 $crate::expression::core::Expression::new(
44 $template,
45 vec![
46 $(
47 $crate::expr_param!($param)
48 ),*
49 ]
50 )
51 };
52}
53
54#[macro_export]
60macro_rules! expr {
61 ($template:expr) => {
63 $crate::expr_as!(serde_json::Value, $template)
64 };
65
66 ($template:expr, $($param:tt),*) => {
68 $crate::expr_as!(serde_json::Value, $template, $($param),*)
69 };
70}
71
72#[macro_export]
81macro_rules! expr_param {
82 (($expr:expr)) => {
84 $crate::traits::expressive::ExpressiveEnum::Nested({
85 #[allow(unused_imports)]
86 use $crate::traits::expressive::Expressive;
87 $expr.expr()
88 })
89 };
90
91 ({$deferred:expr}) => {
93 $deferred.into()
94 };
95
96 ($param:expr) => {
98 $crate::traits::expressive::ExpressiveEnum::Scalar($param.into())
99 };
100}
101
102#[cfg(test)]
103mod tests {
104 use crate::Expression;
105
106 #[test]
107 fn test_expr_macro() {
108 let expr = expr!("age > {}", 18);
109 assert_eq!(expr.template, "age > {}");
110 assert_eq!(expr.parameters.len(), 1);
111 }
112
113 #[test]
114 fn test_expr_as_macro() {
115 let expr = expr_as!(i32, "age > {}", 18);
116 assert_eq!(expr.template, "age > {}");
117 assert_eq!(expr.parameters.len(), 1);
118 }
119
120 #[test]
121 fn test_expr_any_macro() {
122 let expr: Expression<i16> = expr_any!("age > {}", 18i16);
123 assert_eq!(expr.template, "age > {}");
124 assert_eq!(expr.parameters.len(), 1);
125 }
126
127 #[test]
128 fn test_nested_expr() {
129 let inner = expr!("status = {}", "active");
130 let outer = expr!("WHERE {} AND age > {}", (inner), "21");
131
132 assert_eq!(outer.template, "WHERE {} AND age > {}");
133 assert_eq!(outer.parameters.len(), 2);
134 }
135
136 #[test]
137 fn test_preview() {
138 let expr = expr_as!(String, "Hello {}", "world");
139 assert_eq!(expr.preview(), "Hello world");
140 }
141}