use picojson::{BitStackStruct, Event, ParseError, PullParser, SliceParser};
fn main() -> Result<(), ParseError> {
println!("BitStack Configuration Examples");
println!("===============================");
println!("1. Standard SliceParser (u32 BitStack, ~32 levels max):");
let json = r#"{"deeply": {"nested": {"object": {"with": {"data": "test"}}}}}"#;
let mut scratch = [0u8; 512];
let mut parser = SliceParser::with_buffer(json, &mut scratch);
let mut depth = 0;
while let Some(event) = parser.next() {
match event? {
Event::StartObject => {
depth += 1;
println!(" {}StartObject (depth: {})", " ".repeat(depth), depth);
}
Event::EndObject => {
println!(" {}EndObject (depth: {})", " ".repeat(depth), depth);
depth -= 1;
}
Event::Key(k) => println!(" {}Key: {:?}", " ".repeat(depth + 1), &*k),
Event::String(s) => println!(" {}String: {:?}", " ".repeat(depth + 1), &*s),
Event::EndDocument => break,
_ => {}
}
}
println!(" Maximum depth reached: {}\n", depth);
println!("2. Memory-efficient SliceParser (u8 BitStack, ~8 levels max):");
let json = r#"{"shallow": {"data": [1, 2, 3]}}"#;
let mut scratch = [0u8; 256];
let mut parser =
SliceParser::<BitStackStruct<u8, u8>>::with_config_and_buffer(json, &mut scratch);
let mut depth = 0;
while let Some(event) = parser.next() {
match event? {
Event::StartObject => {
depth += 1;
println!(" {}StartObject (depth: {})", " ".repeat(depth), depth);
}
Event::StartArray => {
depth += 1;
println!(" {}StartArray (depth: {})", " ".repeat(depth), depth);
}
Event::EndObject => {
println!(" {}EndObject (depth: {})", " ".repeat(depth), depth);
depth -= 1;
}
Event::EndArray => {
println!(" {}EndArray (depth: {})", " ".repeat(depth), depth);
depth -= 1;
}
Event::Key(k) => println!(" {}Key: {:?}", " ".repeat(depth + 1), &*k),
Event::Number(n) => println!(" {}Number: {}", " ".repeat(depth + 1), n),
Event::EndDocument => break,
_ => {}
}
}
println!(" Maximum depth reached: {}\n", depth);
println!("3. Deep-nesting SliceParser (u64 BitStack, ~64 levels max):");
let json = r#"{"very": {"deeply": {"nested": {"structure": {"with": {"many": {"levels": {"data": "deep"}}}}}}}}"#;
let mut scratch = [0u8; 1024];
let mut parser =
SliceParser::<BitStackStruct<u64, u16>>::with_config_and_buffer(json, &mut scratch);
let mut depth = 0;
while let Some(event) = parser.next() {
match event? {
Event::StartObject => {
depth += 1;
println!(" {}StartObject (depth: {})", " ".repeat(depth), depth);
}
Event::EndObject => {
println!(" {}EndObject (depth: {})", " ".repeat(depth), depth);
depth -= 1;
}
Event::Key(k) => println!(" {}Key: {:?}", " ".repeat(depth + 1), &*k),
Event::String(s) => println!(" {}String: {:?}", " ".repeat(depth + 1), &*s),
Event::EndDocument => break,
_ => {}
}
}
println!(" Maximum depth reached: {}", depth);
Ok(())
}