struct Map(HashMap<OrderedFloat<f64>, Datum<String>>);
impl Map {
- fn new() -> Self {
- Self::default()
- }
-
fn apply(&self, data: &mut Vec<Datum<String>>) {
for value in data {
if let Datum::Number(Some(number)) = value
}
}
}
-
- fn from_vmes(value_map: &[ValueMapEntry]) -> Self {
- let mut map = Map::new();
- for vme in value_map {
- for from in vme.from.split(';') {
- if let Ok(from) = from.trim().parse::<f64>() {
- let to = if let Ok(to) = vme.to.trim().parse::<f64>() {
- Datum::Number(Some(to))
- } else {
- Datum::String(vme.to.clone())
- };
- map.0.insert(OrderedFloat(from), to);
- }
- }
- }
- map
- }
}
/// A warning decoding a legacy XML member.
fn new_name(&self, datum: &Datum<String>, footnotes: &pivot::Footnotes) -> Value {
let mut name = Value::new_datum(datum);
for affix in &self.affixes {
- if let Some(index) = affix.defines_reference.checked_sub(1)
- && let Ok(index) = usize::try_from(index)
- && let Some(footnote) = footnotes.get(index)
- {
+ if let Some(footnote) = footnotes.get(affix.defines_reference.get() - 1) {
name.add_footnote(footnote);
}
}
value_map: Vec<ValueMapEntry>,
}
+impl DerivedVariable {
+ fn mapping(&self) -> Map {
+ Map(self
+ .value_map
+ .iter()
+ .flat_map(|vme| {
+ vme.from
+ .split(';')
+ .filter_map(|from| from.trim().parse::<f64>().ok())
+ .map(|from| {
+ (
+ OrderedFloat(from),
+ if let Ok(to) = vme.to.trim().parse::<f64>() {
+ Datum::Number(Some(to))
+ } else {
+ Datum::String(vme.to.clone())
+ },
+ )
+ })
+ })
+ .collect())
+ }
+}
+
impl Variable for DerivedVariable {
fn decode<'a>(
&'a self,
});
vec![]
};
- Map::from_vmes(&self.value_map).apply(&mut values);
+ self.mapping().apply(&mut values);
if let Some(format) = &self.format {
format.mapping().apply(&mut values);
} else if let Some(string_format) = &self.string_format {
#[derive(Clone, Debug, Deserialize)]
#[serde(rename_all = "camelCase")]
struct Affix {
- /// The footnote number as a natural number: 1 for the first footnote, 2 for
- /// the second, and so on.
+ /// A reference to a footnote with the given 1-based index.
#[serde(rename = "@definesReference")]
- defines_reference: u64,
+ defines_reference: NonZeroUsize,
}
#[derive(Deserialize, Debug)]
{
value.clear_footnotes();
for affix in child.affixes() {
- if let Some(index) = affix.defines_reference.checked_sub(1)
- && let Ok(index) = usize::try_from(index)
- && let Some(footnote) = footnotes.get(index)
- {
+ if let Some(footnote) = footnotes.get(affix.defines_reference.get() - 1) {
value.add_footnote(footnote);
}
}