xml_disassembler/parsers/
parse_to_xml_object.rs1use crate::parsers::{
4 extract_xml_declaration_from_raw, extract_xmlns_from_raw, parse_xml_from_str,
5};
6use crate::types::XmlElement;
7use serde_json::Value;
8use tokio::fs;
9
10pub async fn parse_to_xml_object(file_path: &str) -> Option<XmlElement> {
11 if file_path.to_lowercase().ends_with(".xml") {
12 let content = fs::read_to_string(file_path).await.ok()?;
13 let mut parsed = parse_xml_from_str(&content, file_path)?;
14 if let Some(obj) = parsed.as_object_mut() {
15 if let Some(decl) = extract_xml_declaration_from_raw(&content) {
17 obj.insert("?xml".to_string(), decl);
18 }
19 if let Some(xmlns) = extract_xmlns_from_raw(&content) {
21 let root_key = obj.keys().find(|k| *k != "?xml")?.clone();
22 if let Some(root_val) = obj.get_mut(&root_key) {
23 if let Some(root_obj) = root_val.as_object_mut() {
24 if !root_obj.contains_key("@xmlns") {
25 root_obj.insert("@xmlns".to_string(), Value::String(xmlns));
26 }
27 }
28 }
29 }
30 }
31 return Some(parsed);
32 }
33
34 let content = fs::read_to_string(file_path).await.ok()?;
35
36 if file_path.to_lowercase().ends_with(".yaml") || file_path.to_lowercase().ends_with(".yml") {
37 return serde_yaml::from_str(&content).ok();
38 }
39
40 if file_path.to_lowercase().ends_with(".json5") {
41 return json5::from_str(&content).ok();
42 }
43
44 if file_path.to_lowercase().ends_with(".json") {
45 return serde_json::from_str(&content).ok();
46 }
47
48 None
49}