version-number 1.0.0

Two and three component 'major.minor' and 'major.minor.patch' version number parsing
Documentation
use criterion::{BenchmarkId, Criterion, criterion_group, criterion_main};
use version_number::parsers::modular::Parser as ModularParser;
use version_number::parsers::original::Parser as OriginalParser;

fn current_parse(input: &str) {
    let _ = OriginalParser::from_slice(input.as_bytes()).parse();
}

fn modular_parse(input: &str) {
    let _ = ModularParser::from_slice(input.as_bytes()).parse();
}

pub fn parse_benchmark(c: &mut Criterion) {
    let mut group = c.benchmark_group("Parser");

    for input in [
        "1.0.0",
        "0.1.0",
        "0.0.1",
        "1.0",
        "0.1",
        "999.888.777",
        "999.888",
        "18446744073709551615.0",
        "18446744073709551615.0.0",
    ]
    .iter()
    {
        group.bench_with_input(
            BenchmarkId::new("current[happy]", input),
            input,
            |b, bench_input| b.iter(|| current_parse(bench_input)),
        );

        group.bench_with_input(
            BenchmarkId::new("modular[happy]", input),
            input,
            |b, bench_input| b.iter(|| modular_parse(bench_input)),
        );
    }

    for input in [
        "00.1.1",
        "00.1",
        "0999.999.999",
        "999.0999.999",
        "999.999.0999",
        "0999.999",
        "999.0999",
        "unexpected",
        "1",
        "1,1",
        "1,1,1",
        "18446744073709551616.0.0",
    ]
    .iter()
    {
        group.bench_with_input(
            BenchmarkId::new("current[sad]", input),
            input,
            |b, bench_input| b.iter(|| current_parse(bench_input)),
        );

        group.bench_with_input(
            BenchmarkId::new("modular[sad]", input),
            input,
            |b, bench_input| b.iter(|| modular_parse(bench_input)),
        );
    }

    group.finish();
}

criterion_group!(benches, parse_benchmark,);
criterion_main!(benches);