use ktav::{parse_events, ParseEvent};
const SRC: &str = "\
service: web
port:i 8080
tls: true
upstreams: [
a.example
b.example
]
db: {
host: primary.internal
timeout:i 30
}
";
fn main() {
let mut depth = 0u32;
let mut top_keys: Vec<String> = Vec::new();
parse_events(SRC, |ev| match ev {
ParseEvent::BeginObject | ParseEvent::BeginArray => depth += 1,
ParseEvent::EndObject | ParseEvent::EndArray => depth -= 1,
ParseEvent::Key(k) if depth == 1 => top_keys.push(k.to_string()),
_ => {}
})
.expect("valid Ktav");
println!("top-level keys: {top_keys:?}");
println!("\nevent stream:");
let mut indent = 0;
parse_events(SRC, |ev| {
match &ev {
ParseEvent::EndObject | ParseEvent::EndArray => indent -= 1,
_ => {}
}
let pad = " ".repeat(indent.max(0) as usize);
match ev {
ParseEvent::Null => println!("{pad}null"),
ParseEvent::Bool(b) => println!("{pad}bool={b}"),
ParseEvent::Integer(s) => println!("{pad}int={s}"),
ParseEvent::Float(s) => println!("{pad}float={s}"),
ParseEvent::Str(s) => println!("{pad}str={s:?}"),
ParseEvent::Key(k) => println!("{pad}key={k:?}"),
ParseEvent::BeginObject => {
println!("{pad}{{");
indent += 1;
}
ParseEvent::EndObject => println!("{pad}}}"),
ParseEvent::BeginArray => {
println!("{pad}[");
indent += 1;
}
ParseEvent::EndArray => println!("{pad}]"),
_ => println!("{pad}<unknown — ParseEvent is #[non_exhaustive]>"),
}
})
.expect("valid Ktav");
}