},
spv::{
SpvArchive,
- legacy_bin::LegacyBin,
+ legacy_bin::{DataValue, LegacyBin},
read::{ReadSeek, legacy_xml::Visualization, structure::OutlineItem},
},
};
data.values().flat_map(|map| map.iter()).enumerate()
{
for (value_index, data_value) in values.iter().enumerate() {
- let value = Value::new_datum(&data_value.value).with_value_label(
- (variable_name == "cellFormat")
- .then(|| data_value.as_format(&formats).to_string()),
+ let value = Value::new_datum(data_value).with_value_label(
+ (variable_name == "cellFormat").then(|| {
+ DataValue {
+ value: data_value.clone(),
+ index: None,
+ }
+ .as_format(&formats)
+ .to_string()
+ }),
);
pivot_table.insert([value_index, variable_index], value);
}
impl LegacyBin {
/// Decodes legacy binary data into a map from a series name to a map of
- /// variables, which in turn contains a vector of [DataValue]s.
+ /// variables, which in turn contains a vector of [Datum]s.
pub fn decode(
&self,
warn: &mut dyn FnMut(LegacyBinWarning),
- ) -> IndexMap<String, IndexMap<String, Vec<DataValue>>> {
+ ) -> IndexMap<String, IndexMap<String, Vec<Datum<String>>>> {
let mut sources = IndexMap::new();
for (metadata, data) in self.metadata.iter().zip(&self.data) {
let mut variables = IndexMap::new();
variable
.values
.iter()
- .map(|value| DataValue {
- index: None,
- value: Datum::Number((*value != f64::MIN).then_some(*value)),
- })
+ .map(|value| Datum::Number((*value != f64::MIN).then_some(*value)))
.collect::<Vec<_>>(),
);
}
});
continue;
};
- value.value = Datum::String(label.label.clone());
+ *value = Datum::String(label.label.clone());
}
}
}
if let Datum::Number(Some(number)) = value.value
&& let Some(to) = self.0.get(&OrderedFloat(number))
{
- value.index = Some(number);
value.value = to.clone();
}
}
}
pub fn decode_series(
&self,
- data: IndexMap<String, IndexMap<String, Vec<DataValue>>>,
+ data: IndexMap<String, IndexMap<String, Vec<Datum<String>>>>,
warn: &mut dyn FnMut(LegacyXmlWarning),
) -> BTreeMap<&str, Series> {
let mut source_variables = Vec::new();
pub fn decode(
&self,
- binary_data: IndexMap<String, IndexMap<String, Vec<DataValue>>>,
+ binary_data: IndexMap<String, IndexMap<String, Vec<Datum<String>>>>,
look: Look,
warn: &mut dyn FnMut(LegacyXmlWarning),
) -> Result<PivotTable, super::Error> {
}
fn decode<'a>(
&'a self,
- data: &IndexMap<String, IndexMap<String, Vec<DataValue>>>,
+ data: &IndexMap<String, IndexMap<String, Vec<Datum<String>>>>,
series: &mut BTreeMap<&'a str, Series>,
) -> bool {
let label_series = if let Some(label_variable) = &self.label_variable {
let mut data = if let Some(source) = data.get(&self.source)
&& let Some(values) = source.get(&self.variable)
{
- values.clone()
+ values
+ .iter()
+ .map(|value| DataValue {
+ index: value.as_number().flatten(),
+ value: value.clone(),
+ })
+ .collect()
} else {
Vec::new()
};
});
vec![]
};
+ for datum in &mut values {
+ if let Datum::Number(Some(number)) = &datum.value {
+ datum.index = Some(*number);
+ }
+ }
Map::from_vmes(&self.value_map).apply(&mut values);
if let Some(format) = &self.format {
Map::from_format(format).apply(&mut values);