use vyre_std::pattern::{dfa_assemble, dfa_unpack, AssembleOptions, Pattern, INVALID_STATE};
fn main() {
let patterns = [
Pattern::Literal(b"GET /api"),
Pattern::Literal(b"POST /api"),
Pattern::Regex("PUT /api/v[0-9]+"),
];
let packed =
dfa_assemble(&patterns, AssembleOptions::default()).expect("patterns compile cleanly");
println!(
"Compiled {} patterns into a {}-state DFA ({} bytes, format = {:?}).",
patterns.len(),
packed.state_count,
packed.bytes.len(),
packed.format,
);
let dfa = dfa_unpack(&packed).expect("packed bytes round-trip to Dfa");
for (label, input) in [
("hit literal", &b"GET /api"[..]),
("hit regex v1", &b"PUT /api/v1"[..]),
("hit regex v42", &b"PUT /api/v42"[..]),
("miss", &b"DELETE /api"[..]),
] {
let mut state = dfa.start;
let mut matched = true;
for &b in input {
let next = dfa.go(state, b);
if next == INVALID_STATE {
matched = false;
break;
}
state = next;
}
let accepted = matched && dfa.accept[state as usize];
println!(
" {label:16} {accepted:>5} (input `{:?}`)",
String::from_utf8_lossy(input)
);
}
}