Skip to main content

config_disassembler/xml/parsers/
parse_element.rs

1//! Parse element during disassembly - unified strategy handling.
2
3use 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}