vegafusion_core/transform/
sequence.rs1use 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}