vegafusion_runtime/task_graph/
task.rs1use 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}