coordinate: &'a Series,
}
- let cross = &graph.faceting.cross();
- let columns = cross
- .first()
- .map(|child| child.variables())
- .unwrap_or_default();
let mut dims = Vec::new();
- decode_dimensions(
- columns.into_iter().map(|vr| vr.reference.as_str()),
- &series,
- &axes,
- &styles,
- Axis3::X,
- &footnotes,
- 1,
- &mut dims,
- );
- let rows = cross
- .get(1)
- .map(|child| child.variables())
- .unwrap_or_default();
- decode_dimensions(
- rows.into_iter().map(|vr| vr.reference.as_str()),
- &series,
- &axes,
- &styles,
- Axis3::Y,
- &footnotes,
- 1 + columns.len(),
- &mut dims,
- );
+ let mut level_ofs = 1;
+ let mut dim_series = EnumMap::default();
+ for (axis, dimension) in graph.faceting.dimensions() {
+ dim_series[axis] = decode_dimensions(
+ dimension.iter().copied(),
+ &series,
+ &axes,
+ &styles,
+ axis,
+ &footnotes,
+ level_ofs,
+ &mut dims,
+ );
+ level_ofs += dimension.len();
+ }
- let layer_series = decode_dimensions(
- graph.faceting.layers(),
- &series,
- &axes,
- &styles,
- Axis3::Z,
- &footnotes,
- columns.len() + rows.len() + 1,
- &mut dims,
- );
- let current_layer = layer_series
+ let current_layer = dim_series[Axis3::Z]
.iter()
.map(|series| {
let name = &series.name;
}
impl Faceting {
- fn cross(&self) -> &[CrossChild] {
- self.children
- .iter()
- .find_map(|child| match child {
- FacetingChild::Cross(cross) => Some(cross.children.as_slice()),
- _ => None,
- })
- .unwrap_or(&[])
+ fn dimensions(&self) -> EnumMap<Axis3, Vec<&str>> {
+ let mut dimensions = EnumMap::default();
+ if let Some(cross) = self.cross() {
+ dimensions[Axis3::X] = cross.children[0].variables();
+ dimensions[Axis3::Y] = cross.children[1].variables();
+ }
+ dimensions[Axis3::Z] = self.layers();
+ dimensions
+ }
+ fn cross(&self) -> Option<&Cross> {
+ self.children.iter().find_map(|child| match child {
+ FacetingChild::Cross(cross) => Some(cross),
+ _ => None,
+ })
}
fn layers(&self) -> Vec<&str> {
#[serde(rename_all = "camelCase")]
struct Cross {
#[serde(rename = "$value")]
- children: Vec<CrossChild>,
+ children: [CrossChild; 2],
}
#[derive(Deserialize, Debug)]
}
impl CrossChild {
- fn variables(&self) -> &[VariableReference] {
+ fn variables(&self) -> Vec<&str> {
match self {
- CrossChild::Unity => &[],
- CrossChild::Nest(nest) => &nest.variable_references,
+ CrossChild::Unity => Vec::new(),
+ CrossChild::Nest(nest) => nest
+ .variable_references
+ .iter()
+ .map(|vr| vr.reference.as_str())
+ .collect(),
}
}
}