cleanup
authorBen Pfaff <blp@cs.stanford.edu>
Fri, 2 Jan 2026 17:27:11 +0000 (09:27 -0800)
committerBen Pfaff <blp@cs.stanford.edu>
Fri, 2 Jan 2026 17:27:11 +0000 (09:27 -0800)
rust/pspp/src/spv/read/legacy_xml.rs

index 28a3274df6b5226ac8c827c461666878f4c9ccbe..daecb990c6bd8dc8753b7e5bfc85db132dd1c664 100644 (file)
@@ -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<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> {
@@ -1786,7 +1768,7 @@ enum FacetingChild {
 #[serde(rename_all = "camelCase")]
 struct Cross {
     #[serde(rename = "$value")]
-    children: Vec<CrossChild>,
+    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(),
         }
     }
 }