use winnow::prelude::*;
use winnow::Partial;

mod json;
mod parser;
mod parser_dispatch;
mod parser_partial;

fn json_bench(c: &mut criterion::Criterion) {
    let data = [("small", SMALL), ("canada", CANADA)];
    let mut group = c.benchmark_group("json");
    for (name, sample) in data {
        let len = sample.len();
        group.throughput(criterion::Throughput::Bytes(len as u64));

        group.bench_with_input(criterion::BenchmarkId::new("basic", name), &len, |b, _| {
            type Error<'i> = winnow::error::InputError<parser::Stream<'i>>;

            b.iter(|| parser::json::<Error>.parse_peek(sample).unwrap());
        });
        group.bench_with_input(criterion::BenchmarkId::new("unit", name), &len, |b, _| {
            type Error<'i> = ();

            b.iter(|| parser::json::<Error>.parse_peek(sample).unwrap());
        });
        group.bench_with_input(
            criterion::BenchmarkId::new("context", name),
            &len,
            |b, _| {
                type Error<'i> = winnow::error::ContextError<parser::Stream<'i>>;

                b.iter(|| parser::json::<Error>.parse_peek(sample).unwrap());
            },
        );
        group.bench_with_input(
            criterion::BenchmarkId::new("dispatch", name),
            &len,
            |b, _| {
                type Error<'i> = winnow::error::InputError<parser_dispatch::Stream<'i>>;

                b.iter(|| parser_dispatch::json::<Error>.parse_peek(sample).unwrap());
            },
        );
        group.bench_with_input(
            criterion::BenchmarkId::new("streaming", name),
            &len,
            |b, _| {
                type Error<'i> = winnow::error::InputError<parser_partial::Stream<'i>>;

                b.iter(|| {
                    parser_partial::json::<Error>
                        .parse_peek(Partial::new(sample))
                        .unwrap()
                });
            },
        );
    }
    group.finish();
}

const SMALL: &str = "  { \"a\"\t: 42,
  \"b\": [ \"x\", \"y\", 12 ,\"\\u2014\", \"\\uD83D\\uDE10\"] ,
  \"c\": { \"hello\" : \"world\"
  }
  }  ";

const CANADA: &str = include_str!("../../third_party/nativejson-benchmark/data/canada.json");

criterion::criterion_group!(benches, json_bench,);
criterion::criterion_main!(benches);
