use serde_json::Value;
pub fn havemarks(args: &[&Value], origin: &str) -> Result<(), String> {
for (i, v) in args.iter().enumerate() {
if let Value::Object(d) = v {
for (key, val) in d {
let new_origin = format!("{}[{}]/{}", origin, i, key);
havemarks(&[val], &new_origin)?;
let _ = key;
}
} else if let Value::Array(l) = v {
let new_origin = format!("{}[{}]", origin, i);
let refs: Vec<&Value> = l.iter().collect();
havemarks(&refs, &new_origin)?;
}
}
Ok(())
}
#[cfg(test)]
mod tests {
use super::*;
use serde_json::json;
#[test]
fn havemarks_walks_nested_structure() {
let v = json!({
"a": [1, 2, {"b": [3, 4]}],
"c": "leaf"
});
assert!(havemarks(&[&v], "").is_ok());
}
#[test]
fn havemarks_empty_input_ok() {
assert!(havemarks(&[], "").is_ok());
}
}