From acd4127cd209fc076214f895c3bb7493eaab4600 Mon Sep 17 00:00:00 2001 From: Ben Pfaff Date: Wed, 7 Jan 2026 08:16:47 -0800 Subject: [PATCH] work (fails tests) --- rust/pspp/src/spv/read/light.rs | 76 ++++++++++++--------------------- 1 file changed, 27 insertions(+), 49 deletions(-) diff --git a/rust/pspp/src/spv/read/light.rs b/rust/pspp/src/spv/read/light.rs index a3fe4b6ed7..3c0851a4fd 100644 --- a/rust/pspp/src/spv/read/light.rs +++ b/rust/pspp/src/spv/read/light.rs @@ -1,6 +1,7 @@ use std::{ fmt::Debug, io::{Read, Seek}, + iter::{repeat, zip}, ops::Deref, str::FromStr, sync::Arc, @@ -202,17 +203,14 @@ impl LightTable { dimension }) .collect::>(); - let dimensions = match self.axes.decode(dimensions) { - Ok(dimensions) => dimensions, - Err((warning, dimensions)) => { + let axes = self + .axes + .decode(dimensions.len()) + .unwrap_or_else(|warning| { warn(warning); - dimensions - .into_iter() - .map(|dimension| (Axis3::Y, dimension)) - .collect() - } - }; - let pivot_table = PivotTable::new(dimensions) + vec![Axis3::Y; dimensions.len()] + }); + let pivot_table = PivotTable::new(zip(axes, dimensions)) .with_style(PivotTableStyle { look: Arc::new(self.decode_look(encoding)), rotate_inner_column_labels: self.header.rotate_inner_column_labels, @@ -1755,56 +1753,36 @@ struct Axes { } impl Axes { - fn decode( - &self, - dimensions: Vec, - ) -> Result, (LightWarning, Vec)> { - let n = self.layers.len() + self.rows.len() + self.columns.len(); - if n != dimensions.len() { - return Err(( - LightWarning::WrongAxisCount { - expected: dimensions.len(), - actual: n, - n_layers: self.layers.len(), - n_rows: self.rows.len(), - n_columns: self.columns.len(), - }, - dimensions, - )); + fn decode(&self, n: usize) -> Result, LightWarning> { + let actual = self.layers.len() + self.rows.len() + self.columns.len(); + if actual != n { + return Err(LightWarning::WrongAxisCount { + expected: n, + actual, + n_layers: self.layers.len(), + n_rows: self.rows.len(), + n_columns: self.columns.len(), + }); } + let mut axes = vec![None; n]; + fn axis_dims(axis: Axis3, dimensions: &[u32]) -> impl Iterator { - dimensions.iter().map(move |d| (axis, *d as usize)) + repeat(axis).zip(dimensions.iter().copied().map(|x| x.try_into().unwrap())) } - let mut dimensions = dimensions.into_iter().map(Some).collect::>(); - let mut output = Vec::with_capacity(n); - for (axis, index) in axis_dims(Axis3::Z, &self.layers) .chain(axis_dims(Axis3::Y, &self.rows)) .chain(axis_dims(Axis3::X, &self.columns)) { - let result = dimensions - .get_mut(index) - .ok_or(LightWarning::InvalidDimensionIndex { index, n }) - .and_then(|dimension| { - dimension - .take() - .ok_or(LightWarning::DuplicateDimensionIndex(index)) - }); - match result { - Ok(dimension) => output.push((axis, dimension)), - Err(error) => { - let dimensions = dimensions - .into_iter() - .flatten() - .chain(output.into_iter().map(|(_axis, dimension)| dimension)) - .collect(); - return Err((error, dimensions)); - } + match axes.get_mut(index) { + None => return Err(LightWarning::InvalidDimensionIndex { index, n }), + Some(Some(_)) => return Err(LightWarning::DuplicateDimensionIndex(index)), + Some(inner) => *inner = Some(axis), } } - Ok(output) + + Ok(axes.into_iter().flatten().collect()) } } -- 2.30.2