vegafusion_core/transform/
sequence.rs

1use crate::error::Result;
2use crate::expression::parser::parse;
3use crate::proto::gen::transforms::Sequence;
4use crate::spec::transform::sequence::SequenceTransformSpec;
5use crate::spec::values::{NumberOrSignalSpec, SignalExpressionSpec};
6use crate::transform::TransformDependencies;
7use itertools::sorted;
8use std::collections::HashSet;
9
10use crate::task_graph::task::InputVariable;
11
12impl Sequence {
13    pub fn try_new(spec: &SequenceTransformSpec) -> Result<Self> {
14        let start = match &spec.start {
15            NumberOrSignalSpec::Number(v) => parse(&v.to_string())?,
16            NumberOrSignalSpec::Signal(SignalExpressionSpec { signal }) => parse(signal.as_str())?,
17        };
18        let stop = match &spec.stop {
19            NumberOrSignalSpec::Number(v) => parse(&v.to_string())?,
20            NumberOrSignalSpec::Signal(SignalExpressionSpec { signal }) => parse(signal.as_str())?,
21        };
22
23        let step = match &spec.step {
24            None => None,
25            Some(step) => match step {
26                NumberOrSignalSpec::Number(v) => Some(parse(&v.to_string())?),
27                NumberOrSignalSpec::Signal(SignalExpressionSpec { signal }) => {
28                    Some(parse(signal.as_str())?)
29                }
30            },
31        };
32
33        Ok(Self {
34            start: Some(start),
35            stop: Some(stop),
36            step,
37            r#as: Some(spec.as_()),
38        })
39    }
40}
41
42impl TransformDependencies for Sequence {
43    fn input_vars(&self) -> Vec<InputVariable> {
44        let mut input_vars: HashSet<InputVariable> = HashSet::new();
45        input_vars.extend(self.start.as_ref().unwrap().input_vars());
46        input_vars.extend(self.stop.as_ref().unwrap().input_vars());
47        if let Some(step) = &self.step {
48            input_vars.extend(step.input_vars());
49        }
50        sorted(input_vars).collect()
51    }
52}