crate::ix!();
#[tracing::instrument(level = "trace", skip_all)]
pub fn flatten_fields_if_present(obj: &mut serde_json::Map<String, serde_json::Value>) {
if let Some(fields_val) = obj.remove("fields") {
if let serde_json::Value::Object(fields_map) = fields_val {
trace!("Detected 'fields' object => flattening into top-level.");
for (k, v) in fields_map {
if obj.contains_key(&k) {
warn!("While flattening 'fields', key '{}' already exists in top-level => skipping overwrite.", k);
continue;
}
obj.insert(k, v);
}
} else {
debug!("Key 'fields' is present but not an object => putting it back into top-level as 'fields'.");
obj.insert("fields".to_string(), fields_val);
}
} else {
trace!("No 'fields' key found => nothing to flatten.");
}
}
pub fn flatten_fields_if_present_in_value(value: &mut serde_json::Value) {
match value {
serde_json::Value::Object(obj) => {
if let Some(fields_val) = obj.remove("fields") {
if let serde_json::Value::Object(fields_map) = fields_val {
for (k, v) in fields_map {
obj.insert(k, v);
}
} else {
obj.insert("fields".to_string(), fields_val);
}
}
for (_k, child) in obj.iter_mut() {
flatten_fields_if_present_in_value(child);
}
}
serde_json::Value::Array(arr) => {
for elem in arr {
flatten_fields_if_present_in_value(elem);
}
}
_ => {
}
}
}