config_disassembler/xml/parsers/
parse_element.rs1use crate::xml::builders::build_disassembled_file;
4use crate::xml::types::{UnifiedParseResult, XmlElementArrayMap, XmlElementParams};
5use serde_json::{Map, Value};
6
7fn is_nested_object(element: &Value) -> bool {
8 element
9 .as_object()
10 .map(|obj| {
11 obj.keys()
12 .any(|k| !k.starts_with('#') && !k.starts_with('@') && k != "?xml")
13 })
14 .unwrap_or(false)
15}
16
17pub async fn parse_element_unified(params: XmlElementParams<'_>) -> UnifiedParseResult {
18 let XmlElementParams {
19 element,
20 disassembled_path,
21 unique_id_elements,
22 root_element_name,
23 root_attributes,
24 key,
25 leaf_count,
26 has_nested_elements,
27 format,
28 xml_declaration,
29 strategy,
30 leaf_content: _,
31 precomputed_unique_id,
32 } = params;
33
34 let is_array = element.is_array();
35 let is_nested_obj = is_nested_object(&element);
36 let is_nested = is_array || is_nested_obj;
37
38 if is_nested {
39 if strategy == "grouped-by-tag" {
40 let mut nested = XmlElementArrayMap::new();
41 nested.insert(key.to_string(), vec![element.clone()]);
42 return UnifiedParseResult {
43 leaf_content: Value::Object(Map::new()),
44 leaf_count,
45 has_nested_elements: true,
46 nested_groups: Some(nested),
47 };
48 } else {
49 let _ = build_disassembled_file(crate::xml::types::BuildDisassembledFileOptions {
50 content: element.clone(),
51 disassembled_path,
52 output_file_name: None,
53 subdirectory: Some(key),
54 wrap_key: Some(key),
55 is_grouped_array: false,
56 root_element_name,
57 root_attributes: root_attributes.clone(),
58 format,
59 xml_declaration: xml_declaration.clone(),
60 unique_id_elements,
61 precomputed_unique_id,
62 })
63 .await;
64 return UnifiedParseResult {
65 leaf_content: Value::Object(Map::new()),
66 leaf_count,
67 has_nested_elements: true,
68 nested_groups: None,
69 };
70 }
71 }
72
73 let mut leaf_content = Map::new();
74 leaf_content.insert(key.to_string(), Value::Array(vec![element]));
75 UnifiedParseResult {
76 leaf_content: Value::Object(leaf_content),
77 leaf_count: leaf_count + 1,
78 has_nested_elements,
79 nested_groups: None,
80 }
81}