use asmjson::{Sax, sax_parser};
#[derive(Default, Debug)]
struct Counter {
nulls: usize,
bools: usize,
numbers: usize,
strings: usize,
keys: usize,
objects: usize,
arrays: usize,
}
impl<'src> Sax<'src> for Counter {
type Output = Self;
fn null(&mut self) {
self.nulls += 1;
}
fn bool_val(&mut self, _v: bool) {
self.bools += 1;
}
fn number(&mut self, _s: &'src str) {
self.numbers += 1;
}
fn string(&mut self, _s: &'src str) {
self.strings += 1;
}
fn escaped_string(&mut self, _s: &str) {
self.strings += 1;
}
fn key(&mut self, _s: &'src str) {
self.keys += 1;
}
fn escaped_key(&mut self, _s: &str) {
self.keys += 1;
}
fn start_object(&mut self) {
self.objects += 1;
}
fn end_object(&mut self) {}
fn start_array(&mut self) {
self.arrays += 1;
}
fn end_array(&mut self) {}
fn finish(self) -> Option<Self::Output> {
Some(self)
}
}
const SRC: &str = r#"[
{"id":1,"name":"Alice","active":true,"score":9.5,"tags":["rust","json"]},
{"id":2,"name":"Bob","active":false,"score":null,"tags":["simd","avx512"]},
{"id":3,"name":"Carol","active":true,"score":7.0,"tags":[]}
]"#;
fn report(label: &str, counts: Counter) {
println!("=== {label} ===");
println!("{counts:#?}");
println!();
}
fn main() {
let parser = sax_parser();
let counts = parser.parse(SRC, Counter::default()).expect("parse failed");
report("sax_parser", counts);
}