#![warn(clippy::all, clippy::pedantic)]
use serde_json::Value;
pub fn decode_json_strings(value: Value) -> Value {
match value {
Value::String(s) => {
let trimmed = s.trim();
if trimmed == "None" {
Value::Null
} else if (trimmed.starts_with('{') && trimmed.ends_with('}'))
|| (trimmed.starts_with('[') && trimmed.ends_with(']'))
{
match serde_json::from_str::<Value>(trimmed) {
Ok(parsed) => decode_json_strings(parsed),
Err(_) => Value::String(s),
}
} else {
Value::String(s)
}
}
Value::Object(map) => {
let new_map = map
.into_iter()
.map(|(k, v)| (k, decode_json_strings(v)))
.collect();
Value::Object(new_map)
}
Value::Array(arr) => {
Value::Array(arr.into_iter().map(decode_json_strings).collect())
}
other => other,
}
}
#[must_use]
pub fn extract_training_metadata(raw_metadata: &Value) -> Value {
if let Value::Object(map) = raw_metadata {
if let Some(meta) = map.get("__metadata__") {
match meta {
Value::String(s) => {
if let Ok(parsed) = serde_json::from_str::<Value>(s) {
decode_json_strings(parsed)
} else {
let mut new_map = serde_json::Map::new();
new_map
.insert(
"invalid_json".to_string(),
Value::String(s.clone()),
);
Value::Object(new_map)
}
}
other => decode_json_strings(other.clone()),
}
} else {
decode_json_strings(raw_metadata.clone())
}
} else {
Value::Object(serde_json::Map::new())
}
}
#[cfg(test)]
mod tests {
use super::*;
use serde_json::json;
#[test]
fn test_decode_json_strings_none() {
let value = Value::String("None".to_string());
let decoded = decode_json_strings(value);
assert_eq!(decoded, Value::Null);
}
#[test]
fn test_decode_json_strings_object() {
let input = json!(
{ "resize_params" :
"{\"recipe_str\": \"fro_ckpt=1,thr=-3.55\", \"weights\": {\"spn_lora\": 0.0, \"spn_ckpt\": 0.0, \"subspace\": 0.0, \"fro_lora\": 0.0, \"fro_ckpt\": 1.0, \"params\": 0.0}, \"target_size\": null, \"threshold\": -3.55, \"rescale\": 1.0}"
}
);
let decoded = decode_json_strings(input);
let expected = json!(
{ "resize_params" : { "recipe_str" : "fro_ckpt=1,thr=-3.55", "weights" : {
"spn_lora" : 0.0, "spn_ckpt" : 0.0, "subspace" : 0.0, "fro_lora" : 0.0,
"fro_ckpt" : 1.0, "params" : 0.0 }, "target_size" : null, "threshold" : -
3.55, "rescale" : 1.0 } }
);
assert_eq!(decoded, expected);
}
#[test]
fn test_extract_training_metadata() {
let raw = json!(
{ "__metadata__" :
"{\"ss_bucket_info\": \"{\\\"buckets\\\": {\\\"0\\\": {\\\"resolution\\\": [1280, 800], \\\"count\\\": 78}}, \\\"mean_img_ar_error\\\": 0.0}\"}"
}
);
let extracted = extract_training_metadata(&raw);
let expected = json!(
{ "ss_bucket_info" : { "buckets" : { "0" : { "resolution" : [1280, 800],
"count" : 78 } }, "mean_img_ar_error" : 0.0 } }
);
assert_eq!(extracted, expected);
}
}