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}