use serde_json::Value;
pub(super) fn normalize_metadata_map(value: Value) -> Value {
match value {
Value::Object(object) => Value::Object(
object
.into_iter()
.map(|(key, value)| (key, Value::String(value_to_string(&value))))
.collect(),
),
value => value,
}
}
pub(super) fn value_to_string(value: &Value) -> String {
match value {
Value::Null => "None".to_string(),
Value::Bool(true) => "True".to_string(),
Value::Bool(false) => "False".to_string(),
Value::Number(number) => number.to_string(),
Value::String(value) => value.clone(),
Value::Array(_) | Value::Object(_) => value_to_repr(value),
}
}
fn value_to_repr(value: &Value) -> String {
match value {
Value::Null => "None".to_string(),
Value::Bool(true) => "True".to_string(),
Value::Bool(false) => "False".to_string(),
Value::Number(number) => number.to_string(),
Value::String(value) => format!("'{}'", value.replace('\\', "\\\\").replace('\'', "\\'")),
Value::Array(items) => {
let items = items.iter().map(value_to_repr).collect::<Vec<_>>();
format!("[{}]", items.join(", "))
}
Value::Object(object) => {
let items = object
.iter()
.map(|(key, value)| {
format!("'{}': {}", key.replace('\'', "\\'"), value_to_repr(value))
})
.collect::<Vec<_>>();
format!("{{{}}}", items.join(", "))
}
}
}