Skip to main content

vantage_cmd/
expr_data_source.rs

1//! `DataSource` + `ExprDataSource` impls for `Cmd`.
2//!
3//! Same shape as `vantage-aws`: `execute` resolves the single deferred
4//! parameter that `column_table_values_expr` produces (the projection
5//! used by relation traversal). Nothing else needs a real implementation.
6
7use ciborium::Value as CborValue;
8use vantage_core::Result;
9use vantage_expressions::{
10    Expression, resolve_param,
11    traits::datasource::{DataSource, ExprDataSource},
12    traits::expressive::{DeferredFn, ExpressiveEnum},
13};
14
15use crate::cmd::Cmd;
16
17impl DataSource for Cmd {}
18
19impl ExprDataSource<CborValue> for Cmd {
20    async fn execute(&self, expr: &Expression<CborValue>) -> Result<CborValue> {
21        if expr.parameters.is_empty() {
22            Ok(CborValue::Text(expr.template.clone()))
23        } else if expr.parameters.len() == 1 {
24            // Collapses a `column_table_values_expr` chain
25            // (Nested → Deferred → Scalar) to the projected array.
26            resolve_param(&expr.parameters[0], |t| CborValue::Text(t.to_string())).await
27        } else {
28            Ok(CborValue::Null)
29        }
30    }
31
32    fn defer(&self, expr: Expression<CborValue>) -> DeferredFn<CborValue> {
33        let this = self.clone();
34        DeferredFn::new(move || {
35            let this = this.clone();
36            let expr = expr.clone();
37            Box::pin(async move {
38                let result = ExprDataSource::execute(&this, &expr).await?;
39                Ok(ExpressiveEnum::Scalar(result))
40            })
41        })
42    }
43}