From fcc540f348e5f874ecd94b62b04ffd9db50ea540 Mon Sep 17 00:00:00 2001 From: Ben Pfaff Date: Fri, 2 Jan 2026 09:27:11 -0800 Subject: [PATCH] cleanup --- rust/pspp/src/spv/read/legacy_xml.rs | 90 ++++++++++++---------------- 1 file changed, 38 insertions(+), 52 deletions(-) diff --git a/rust/pspp/src/spv/read/legacy_xml.rs b/rust/pspp/src/spv/read/legacy_xml.rs index 28a3274df6..daecb990c6 100644 --- a/rust/pspp/src/spv/read/legacy_xml.rs +++ b/rust/pspp/src/spv/read/legacy_xml.rs @@ -561,48 +561,24 @@ impl Visualization { 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; @@ -1742,14 +1718,20 @@ struct Faceting { } 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> { + 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> { @@ -1786,7 +1768,7 @@ enum FacetingChild { #[serde(rename_all = "camelCase")] struct Cross { #[serde(rename = "$value")] - children: Vec, + children: [CrossChild; 2], } #[derive(Deserialize, Debug)] @@ -1799,10 +1781,14 @@ enum CrossChild { } 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(), } } } -- 2.30.2