Skip to main content

vantage_csv/
expr_data_source.rs

1//! `ExprDataSource` for CSV: executing an expression resolves its deferred
2//! parameters, which is how `column_table_values_expr` yields its list.
3
4use vantage_expressions::traits::datasource::ExprDataSource;
5use vantage_expressions::traits::expressive::DeferredFn;
6use vantage_expressions::{Expression, defer_execute, execute_by_resolving};
7
8use crate::Csv;
9use crate::condition::resolve_param;
10use crate::type_system::AnyCsvType;
11
12impl ExprDataSource<AnyCsvType> for Csv {
13    async fn execute(&self, expr: &Expression<AnyCsvType>) -> vantage_core::Result<AnyCsvType> {
14        // Multi-param expressions resolve each param and join the values
15        // comma-separated.
16        execute_by_resolving(
17            expr,
18            |template| AnyCsvType::new(template.to_string()),
19            |params| async move {
20                let mut results = Vec::with_capacity(params.len());
21                for param in params {
22                    results.push(resolve_param(param).await?.value().clone());
23                }
24                Ok(AnyCsvType::new(results.join(",")))
25            },
26        )
27        .await
28    }
29
30    fn defer(&self, expr: Expression<AnyCsvType>) -> DeferredFn<AnyCsvType>
31    where
32        AnyCsvType: Clone + Send + Sync + 'static,
33    {
34        defer_execute(self, expr)
35    }
36}