sdformat_rs/
funcs.rs

1use crate::deserialize::*;
2use crate::errors::*;
3
4use std::collections::HashMap;
5use std::path::Path;
6
7fn sort_elements(par_elm: &xml::Element) -> xml::Element {
8    let mut elems = HashMap::<&str, Vec<xml::Xml>>::new();
9    for c in &par_elm.children {
10        if let xml::Xml::ElementNode(ref xml_elm) = *c {
11            let sorted_xml_elm = sort_elements(&xml_elm);
12            elems
13                .entry(&xml_elm.name)
14                .or_insert_with(Vec::new)
15                .push(xml::Xml::ElementNode(sorted_xml_elm));
16        } else {
17            elems
18                .entry("__value")
19                .or_insert_with(Vec::new)
20                .push(c.clone());
21        }
22    }
23    let mut new_par_elm = par_elm.clone();
24    new_par_elm.children = elems
25        .into_iter()
26        .flat_map(|(_s, v)| v.into_iter())
27        .collect::<Vec<xml::Xml>>();
28    new_par_elm
29}
30
31pub fn read_file<P: AsRef<Path>>(path: P) -> Result<Vec<Model>> {
32    read_from_string(&std::fs::read_to_string(path)?)
33}
34
35pub fn read_from_string(string: &str) -> Result<Vec<Model>> {
36    let e: xml::Element = string.parse().map_err(SdfError::new)?;
37    let mut models = Vec::new();
38    for c in &e.children {
39        if let xml::Xml::ElementNode(ref xml_elm) = *c {
40            if xml_elm.name == "model" {
41                let src_xml: xml::Element =
42                    format!("{}", xml_elm).parse().map_err(SdfError::new)?;
43                let sorted_xml = sort_elements(&src_xml);
44                let model =
45                    serde_xml_rs::from_str(&format!("{}", sorted_xml)).map_err(SdfError::new)?;
46                models.push(model);
47            }
48        };
49    }
50    Ok(models)
51}