vegafusion_core/transform/
timeunit.rs

1use crate::error::Result;
2use crate::proto::gen::tasks::Variable;
3use crate::proto::gen::transforms::{TimeUnit, TimeUnitTimeZone, TimeUnitUnit};
4use crate::spec::transform::timeunit::{
5    TimeUnitTimeZoneSpec, TimeUnitTransformSpec, TimeUnitUnitSpec,
6};
7use crate::transform::TransformDependencies;
8
9impl TimeUnit {
10    pub fn try_new(transform: &TimeUnitTransformSpec) -> Result<Self> {
11        let field = transform.field.clone();
12        let units: Vec<_> = transform
13            .units
14            .iter()
15            .flat_map(|units| units.iter().map(|unit| TimeUnitUnit::from(unit) as i32))
16            .collect();
17        let signal = transform.signal.clone();
18
19        let alias_0 = transform.as_.as_ref().and_then(|v| v.first().cloned());
20        let alias_1 = transform.as_.as_ref().and_then(|v| v.get(1).cloned());
21
22        let timezone = match &transform.timezone {
23            None => None,
24            Some(timezone) => match timezone {
25                TimeUnitTimeZoneSpec::Local => Some(TimeUnitTimeZone::Local as i32),
26                TimeUnitTimeZoneSpec::Utc => Some(TimeUnitTimeZone::Utc as i32),
27            },
28        };
29
30        Ok(Self {
31            field,
32            units,
33            signal,
34            alias_0,
35            alias_1,
36            timezone,
37        })
38    }
39}
40
41impl From<&TimeUnitUnitSpec> for TimeUnitUnit {
42    fn from(unit: &TimeUnitUnitSpec) -> Self {
43        match unit {
44            TimeUnitUnitSpec::Year => Self::Year,
45            TimeUnitUnitSpec::Quarter => Self::Quarter,
46            TimeUnitUnitSpec::Month => Self::Month,
47            TimeUnitUnitSpec::Date => Self::Date,
48            TimeUnitUnitSpec::Week => Self::Week,
49            TimeUnitUnitSpec::Day => Self::Day,
50            TimeUnitUnitSpec::DayOfYear => Self::DayOfYear,
51            TimeUnitUnitSpec::Hours => Self::Hours,
52            TimeUnitUnitSpec::Minutes => Self::Minutes,
53            TimeUnitUnitSpec::Seconds => Self::Seconds,
54            TimeUnitUnitSpec::Milliseconds => Self::Milliseconds,
55        }
56    }
57}
58
59impl TransformDependencies for TimeUnit {
60    fn output_vars(&self) -> Vec<Variable> {
61        self.signal
62            .iter()
63            .map(|s| Variable::new_signal(s))
64            .collect()
65    }
66}