eventson 0.1.0

An event based JSON parser with competitive performance
Documentation
use std::io::{Cursor, Read};

use eventson::{Event, Number, Parser};

struct FooBar {
    foo: u64,
    bar: u64,
}

fn main() {
    let input = r#"
        { "foo": 1, "bar": 3 }
        { "foo": 10, "bar": 12}
        { "foo": 8, "bar": 14}
    "#;

    let reader = Cursor::new(input);
    let mut parser = eventson::Parser::new(reader, 16, 8);
    let mut foo_bar = FooBar { foo: 0, bar: 0 };

    let mut foo_bar_diff = 0;
    let mut count = 0;
    while let Ok(event) = parser.next() {
        match event {
            Event::StartObject => {
                continue;
            }
            Event::ObjectKey(b"foo") => {
                foo_bar.foo = expect_float(&mut parser);
            }
            Event::ObjectKey(b"bar") => {
                foo_bar.bar = expect_float(&mut parser);
            }
            Event::EndObject => {
                foo_bar_diff += foo_bar.bar - foo_bar.foo;
                count += 1;
            }
            Event::Eof => {
                break;
            }
            _ => {
                panic!("Unexpected event: {:?}", event);
            }
        }
    }

    let very_useful_average = foo_bar_diff / count;
    println!("{very_useful_average}")
}

// TODO: What kinds of facilities like this should I include in the library?
fn expect_float<R: Read>(parser: &mut Parser<R>) -> u64 {
    match parser.next().unwrap() {
        Event::Number(Number::PositiveInt(n)) => n,
        event => {
            panic!("Unexpected event: {:?}", event);
        }
    }
}