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