fixed pretty format for xml
All checks were successful
Version Check / check-version (pull_request) Successful in 3s

This commit is contained in:
2026-03-18 17:38:05 +01:00
parent 30fd2d5d75
commit a2ec8660c7

View File

@@ -119,38 +119,99 @@ fn xml_to_json(content: &str) -> anyhow::Result<Value> {
} }
fn json_to_xml(value: &Value) -> String { fn json_to_xml(value: &Value) -> String {
match value { use quick_xml::Writer;
Value::Object(map) => { use quick_xml::events::{Event, BytesStart, BytesEnd, BytesText};
let mut s = String::new();
for (k, v) in map { let mut writer = Writer::new_with_indent(Vec::new(), b' ', 4);
if k == "$text" {
s.push_str(v.as_str().unwrap_or("")); fn write_recursive(writer: &mut Writer<Vec<u8>>, value: &Value, key_name: Option<&str>) {
} else if let Some(arr) = v.as_array() { if let Some(k) = key_name {
for item in arr { if k == "$text" {
s.push_str(&format!("<{}>", k)); if let Some(s) = value.as_str() {
s.push_str(&json_to_xml(item)); writer.write_event(Event::Text(BytesText::new(s))).unwrap();
s.push_str(&format!("</{}>", k)); }
return;
}
}
match value {
Value::Object(map) => {
if let Some(k) = key_name {
writer.write_event(Event::Start(BytesStart::new(k))).unwrap();
}
for (k, v) in map {
if let Some(arr) = v.as_array() {
for item in arr {
write_recursive(writer, item, Some(k));
}
} else {
write_recursive(writer, v, Some(k));
} }
} else { }
s.push_str(&format!("<{}>", k)); if let Some(k) = key_name {
s.push_str(&json_to_xml(v)); writer.write_event(Event::End(BytesEnd::new(k))).unwrap();
s.push_str(&format!("</{}>", k));
} }
} }
s Value::Array(arr) => {
} for v in arr {
Value::Array(arr) => { write_recursive(writer, v, key_name);
let mut s = String::new(); }
for v in arr { }
s.push_str(&json_to_xml(v)); Value::String(s) => {
if let Some(k) = key_name {
writer.write_event(Event::Start(BytesStart::new(k))).unwrap();
}
writer.write_event(Event::Text(BytesText::new(s))).unwrap();
if let Some(k) = key_name {
writer.write_event(Event::End(BytesEnd::new(k))).unwrap();
}
}
Value::Number(n) => {
if let Some(k) = key_name {
writer.write_event(Event::Start(BytesStart::new(k))).unwrap();
}
writer.write_event(Event::Text(BytesText::new(&n.to_string()))).unwrap();
if let Some(k) = key_name {
writer.write_event(Event::End(BytesEnd::new(k))).unwrap();
}
}
Value::Bool(b) => {
if let Some(k) = key_name {
writer.write_event(Event::Start(BytesStart::new(k))).unwrap();
}
writer.write_event(Event::Text(BytesText::new(&b.to_string()))).unwrap();
if let Some(k) = key_name {
writer.write_event(Event::End(BytesEnd::new(k))).unwrap();
}
}
Value::Null => {
if let Some(k) = key_name {
writer.write_event(Event::Empty(BytesStart::new(k))).unwrap();
}
} }
s
} }
Value::String(v) => v.clone(),
Value::Number(v) => v.to_string(),
Value::Bool(v) => v.to_string(),
Value::Null => "".to_string(),
} }
if value.is_object() {
for (k, v) in value.as_object().unwrap() {
if let Some(arr) = v.as_array() {
for item in arr {
write_recursive(&mut writer, item, Some(k));
}
} else {
write_recursive(&mut writer, v, Some(k));
}
}
} else {
write_recursive(&mut writer, value, None);
}
// Quick-XML adds a trailing newline occasionally, or we might need one
let mut out = String::from_utf8(writer.into_inner()).unwrap();
if !out.ends_with('\n') {
out.push('\n');
}
out
} }
fn flatten(value: &Value, current_path: Vec<PathSegment>, key_name: Option<String>, depth: usize, vars: &mut Vec<ConfigItem>) { fn flatten(value: &Value, current_path: Vec<PathSegment>, key_name: Option<String>, depth: usize, vars: &mut Vec<ConfigItem>) {