#![allow(missing_docs, reason = "no need for API documentation on benchmark code")]
use std::hint::black_box;
use criterion::{Criterion, criterion_group, criterion_main};
use http_path_template::{Grammar, PathTemplate};
const LITERAL_ONLY: &str = "/v1/shelves/books/list";
const VARIABLES: &str = "/v1/shelves/{shelf}/books/{book}";
const REST_WILDCARD: &str = "/v1/{name=books/**}";
const VERB: &str = "/v1/shelves/{shelf}/books/{book}:archive";
const AFFIX: &str = "/v1/files/{name}.json";
const INVALID: &str = "/a/**/b";
fn parse(c: &mut Criterion) {
let mut group = c.benchmark_group("hpt_parse/parse");
let strict = Grammar::default();
let extended = Grammar::default().with_segment_affixes();
group.bench_function("literal_only", |b| {
b.iter(|| black_box(PathTemplate::parse(black_box(LITERAL_ONLY), strict)));
});
group.bench_function("variables", |b| {
b.iter(|| black_box(PathTemplate::parse(black_box(VARIABLES), strict)));
});
group.bench_function("rest_wildcard", |b| {
b.iter(|| black_box(PathTemplate::parse(black_box(REST_WILDCARD), strict)));
});
group.bench_function("verb", |b| {
b.iter(|| black_box(PathTemplate::parse(black_box(VERB), strict)));
});
group.bench_function("affix", |b| {
b.iter(|| black_box(PathTemplate::parse(black_box(AFFIX), extended)));
});
group.bench_function("invalid", |b| {
b.iter(|| black_box(PathTemplate::parse(black_box(INVALID), strict)));
});
group.finish();
}
criterion_group!(benches, parse);
criterion_main!(benches);