vantage_sql/sqlite/macros.rs
1/// Create a SQL expression with `serde_json::Value` as the value type.
2///
3/// This is the untyped variant — parameters are plain JSON values without
4/// type markers. Useful for statement builders (Step 3) where types are
5/// inferred from context.
6///
7/// - `sql_expr!("template")` — no parameters
8/// - `sql_expr!("template", scalar)` — scalar becomes `ExpressiveEnum::Scalar(scalar.into())`
9/// - `sql_expr!("template", (expr))` — expr becomes `ExpressiveEnum::Nested(expr.expr())`
10#[macro_export]
11macro_rules! sql_expr {
12 ($template:expr) => {
13 vantage_expressions::Expression::<serde_json::Value>::new($template, vec![])
14 };
15
16 ($template:expr, $($param:tt),*) => {
17 vantage_expressions::Expression::<serde_json::Value>::new(
18 $template,
19 vec![
20 $(
21 vantage_expressions::expr_param!($param)
22 ),*
23 ]
24 )
25 };
26}
27
28/// Create a SQL expression with `AnySqliteType` as the value type.
29///
30/// This is the typed variant — parameters carry SQLite type markers (Integer,
31/// Text, Real, etc.) which are used for type-aware binding via `bind_sqlite_value`.
32/// Use this when building expressions for `ExprDataSource::execute()`.
33///
34/// Scalar arguments must implement `Into<AnySqliteType>` — supported types are:
35/// `i8`–`u32`, `f32`/`f64`, `bool`, `String`, and `&str`.
36///
37/// ```ignore
38/// let expr = sqlite_expr!("SELECT * FROM product WHERE price > {}", 100i64);
39/// let result = db.execute(&expr).await?;
40/// ```
41#[macro_export]
42macro_rules! sqlite_expr {
43 ($template:expr) => {
44 vantage_expressions::Expression::<$crate::sqlite::AnySqliteType>::new($template, vec![])
45 };
46
47 ($template:expr, $($param:tt),*) => {
48 vantage_expressions::Expression::<$crate::sqlite::AnySqliteType>::new(
49 $template,
50 vec![
51 $(
52 vantage_expressions::expr_param!($param)
53 ),*
54 ]
55 )
56 };
57}