vantage_cmd/
expr_data_source.rs1use 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 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}