json-event-parser-blocks 0.1.0

add 'skipper' and serde support for json-event-parser
Documentation
use json_event_parser::{JsonEvent, ReaderJsonParser};
use json_event_parser_blocks::Skipper;

fn skip_test(json: &str, check_y: &str) {
    #[derive(Copy, Clone, Eq, PartialEq, Debug)]
    enum State {
        WaitScope,
        InScopeWaitX,
        InScopeSkippingWaitY,
        InScopeWaitYValue,
        WaitEndScope,
        Done,
    }

    let mut reader = ReaderJsonParser::new(json.as_bytes());
    let mut skipper = Skipper::new();
    let mut state = State::WaitScope;
    let mut y: Option<String> = None;

    loop {
        let event = reader.parse_next().unwrap();
        match event {
            JsonEvent::StartObject if state == State::WaitScope => {
                state = State::InScopeWaitX;
            }
            JsonEvent::EndObject if state == State::WaitEndScope => {
                state = State::Done;
            }
            JsonEvent::ObjectKey(k) if state == State::InScopeWaitX && k == "x" => {
                state = State::InScopeSkippingWaitY;
            }
            event if state == State::InScopeSkippingWaitY && skipper.skipping() => {
                skipper.on_event(&event).unwrap();
            }
            JsonEvent::ObjectKey(k) if state == State::InScopeSkippingWaitY && k == "y" => {
                state = State::InScopeWaitYValue;
            }
            JsonEvent::Number(v) if state == State::InScopeWaitYValue => {
                state = State::WaitEndScope;
                y = Some(v.to_string());
            }
            JsonEvent::Eof => {
                break;
            }
            event => {
                panic!("unexpected event {:?} of state {:?}", event, state);
            }
        }
    }

    assert!(!skipper.skipping());
    assert_eq!(state, State::Done);
    assert_eq!(y.as_deref(), Some(check_y));
}

#[test]
fn skip_single_value() {
    skip_test(
        r#"
                {
                    "x": 1,
                    "y": 2
                }
            "#,
        "2",
    );
}

#[test]
fn skip_object() {
    skip_test(
        r#"
                {
                    "x": {"sub_a": true, "sub_b": "text", "sub_c": []},
                    "y": 2
                }
            "#,
        "2",
    );
}

#[test]
fn skip_array() {
    skip_test(
        r#"
                {
                    "x": [1, true, "text", {}],
                    "y": 2
                }
            "#,
        "2",
    );
}