data: IndexMap<String, IndexMap<String, Vec<Datum<String>>>>,
warn: &mut dyn FnMut(LegacyXmlWarning),
) -> BTreeMap<&str, Series> {
- let mut source_variables = Vec::new();
- let mut derived_variables = Vec::new();
+ let mut variables: Vec<&dyn Variable> = Vec::new();
for child in &self.children {
match child {
- VisChild::SourceVariable(source_variable) => source_variables.push(source_variable),
- VisChild::DerivedVariable(derived_variable) => {
- derived_variables.push(derived_variable)
- }
+ VisChild::SourceVariable(source_variable) => variables.push(source_variable),
+ VisChild::DerivedVariable(derived_variable) => variables.push(derived_variable),
_ => (),
}
}
let mut series = BTreeMap::<&str, Series>::new();
- while let n = source_variables.len() + derived_variables.len()
+ while let n = variables.len()
&& n > 0
{
- source_variables.retain(|sv| !sv.decode(&data, &mut series));
- derived_variables.retain(|dv| !dv.decode(&mut series, warn));
+ variables.retain(|variable| !variable.decode(&data, &mut series, warn));
- if n == source_variables.len() + derived_variables.len() {
+ if n == variables.len() {
warn(LegacyXmlWarning::UnresolvedDependencies(
- source_variables
+ variables
.iter()
- .map(|sv| sv.variable.clone())
- .chain(derived_variables.iter().map(|dv| dv.id.clone()))
+ .map(|variable| variable.name().into())
.collect(),
));
break;
}
}
+trait Variable {
+ fn decode<'a>(
+ &'a self,
+ data: &IndexMap<String, IndexMap<String, Vec<Datum<String>>>>,
+ series: &mut BTreeMap<&'a str, Series>,
+ warn: &mut dyn FnMut(LegacyXmlWarning),
+ ) -> bool;
+ fn name(&self) -> &str;
+}
+
#[derive(Deserialize, Debug)]
#[serde(rename_all = "camelCase")]
struct SourceVariable {
&[]
}
}
+}
+impl Variable for SourceVariable {
fn decode<'a>(
&'a self,
data: &IndexMap<String, IndexMap<String, Vec<Datum<String>>>>,
series: &mut BTreeMap<&'a str, Series>,
+ _warn: &mut dyn FnMut(LegacyXmlWarning),
) -> bool {
let label_series = if let Some(label_variable) = &self.label_variable {
if let Some(label_series) = series.get(label_variable.references.as_str()) {
);
true
}
+ fn name(&self) -> &str {
+ &self.variable
+ }
}
#[derive(Deserialize, Debug)]
value_map: Vec<ValueMapEntry>,
}
-impl DerivedVariable {
+impl Variable for DerivedVariable {
fn decode<'a>(
&'a self,
+ _data: &IndexMap<String, IndexMap<String, Vec<Datum<String>>>>,
series: &mut BTreeMap<&'a str, Series>,
warn: &mut dyn FnMut(LegacyXmlWarning),
) -> bool {
);
true
}
+ fn name(&self) -> &str {
+ &self.id
+ }
}
#[derive(Deserialize, Debug)]