vegafusion_runtime/task_graph/
task.rs

1use crate::task_graph::timezone::RuntimeTzConfig;
2use async_trait::async_trait;
3use datafusion::prelude::SessionContext;
4use std::collections::HashMap;
5use std::convert::TryInto;
6use std::sync::Arc;
7use vegafusion_core::data::dataset::VegaFusionDataset;
8use vegafusion_core::error::Result;
9use vegafusion_core::proto::gen::tasks::task::TaskKind;
10use vegafusion_core::proto::gen::tasks::Task;
11use vegafusion_core::task_graph::task_value::TaskValue;
12
13#[async_trait]
14pub trait TaskCall {
15    async fn eval(
16        &self,
17        values: &[TaskValue],
18        tz_config: &Option<RuntimeTzConfig>,
19        inline_datasets: HashMap<String, VegaFusionDataset>,
20        ctx: Arc<SessionContext>,
21    ) -> Result<(TaskValue, Vec<TaskValue>)>;
22}
23
24#[async_trait]
25impl TaskCall for Task {
26    async fn eval(
27        &self,
28        values: &[TaskValue],
29        tz_config: &Option<RuntimeTzConfig>,
30        inline_datasets: HashMap<String, VegaFusionDataset>,
31        ctx: Arc<SessionContext>,
32    ) -> Result<(TaskValue, Vec<TaskValue>)> {
33        match self.task_kind() {
34            TaskKind::Value(value) => Ok((value.try_into()?, Default::default())),
35            TaskKind::DataUrl(task) => task.eval(values, tz_config, inline_datasets, ctx).await,
36            TaskKind::DataValues(task) => task.eval(values, tz_config, inline_datasets, ctx).await,
37            TaskKind::DataSource(task) => task.eval(values, tz_config, inline_datasets, ctx).await,
38            TaskKind::Signal(task) => task.eval(values, tz_config, inline_datasets, ctx).await,
39        }
40    }
41}