Skip to content

Instantly share code, notes, and snippets.

@weiznich
Created March 31, 2023 12:08
Show Gist options
  • Save weiznich/78a541904ea08c0375c64f2cf7a96eb0 to your computer and use it in GitHub Desktop.
Save weiznich/78a541904ea08c0375c64f2cf7a96eb0 to your computer and use it in GitHub Desktop.
use std::fs::File;
use std::io::BufReader;
use serde::de::Deserialize;
use serde_json::Value;
fn main() {
let p = File::open("/tmp/test_json_stuff/diesel.json").unwrap();
let reader = BufReader::new(p);
let mut des = serde_json::Deserializer::from_reader(reader);
des.disable_recursion_limit();
let v = serde_json::Value::deserialize(&mut des).unwrap();
let max_depth = traverse_tree(&v);
println!("Max depth: {max_depth}");
let max_path = get_max_path(&v, max_depth);
let max_path = max_path.into_iter().rev().collect::<Vec<_>>();
println!("Max path: {max_path:?}");
if let Value::Object(o) = &v {
let v = o.get("index").unwrap();
if let Value::Object(o) = v {
let v = o.get("0:40213").unwrap();
for (k, v) in v.as_object().unwrap() {
if k != "inner" {
println!("{k}: {v:?}");
}
}
} else {
panic!();
}
} else {
panic!();
}
println!("Hello, world!");
}
fn traverse_tree(v: &Value) -> usize {
match v {
Value::Null => 1,
Value::Bool(_) => 1,
Value::Number(_) => 1,
Value::String(_) => 1,
Value::Array(a) => a.iter().map(traverse_tree).max().unwrap_or(0) + 1,
Value::Object(o) => o.values().map(traverse_tree).max().unwrap_or(0) + 1,
}
}
fn get_max_path(v: &Value, p: usize) -> Vec<String> {
match v {
Value::Null |
Value::Bool(_) |
Value::Number(_) |
Value::String(_) => Vec::new(),
Value::Array(a) => {
if let Some((i, v)) = a.iter().enumerate().find(|(_, v)| traverse_tree(v) >= p -1){
let mut r = get_max_path(v, p - 1);
r.push(i.to_string());
r
} else if a.is_empty() && p == 1 {
Vec::new()
} else {
unimplemented!()
}
}
Value::Object(o) =>{
let (i, v) = o.iter().find(|(_, v)| traverse_tree(v) == p -1).unwrap();
let mut r = get_max_path(v, p - 1);
r.push(i.clone());
r
} ,
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment