use regexsolver::regex::RegularExpression;
use regexsolver::{
Term,
fast_automaton::{CharacterOrder, GenerationOptions, PathOrder},
};
fn main() -> Result<(), Box<dyn std::error::Error>> {
let mut args = std::env::args().skip(1);
let Some(pattern) = args.next() else {
eprintln!(
"Usage: cargo run --example generate -- <pattern> [count] [sweep|interleave|shuffled] [charset]"
);
std::process::exit(2);
};
let count: usize = args.next().map(|c| c.parse()).transpose()?.unwrap_or(10);
let axes = match args.next().as_deref() {
None | Some("sweep") => (PathOrder::Sweep, CharacterOrder::Ascending),
Some("interleave") => (PathOrder::Interleave, CharacterOrder::Ascending),
Some("shuffled") => (PathOrder::Shuffled, CharacterOrder::Shuffled),
Some(other) => {
eprintln!("Unknown order {other:?}, expected `sweep`, `interleave` or `shuffled`");
std::process::exit(2);
}
};
let mut options = GenerationOptions::from(axes);
if let Some(charset) = args.next() {
match RegularExpression::new(&charset)? {
RegularExpression::Character(charset) => options = options.with_charset(charset),
_ => {
eprintln!("The charset has to be a single character class, e.g. \"[ -~]\"");
std::process::exit(2);
}
}
}
let term = Term::from_pattern(&pattern)?.minimize()?;
for string in term.generate_strings(count, 0, options)? {
println!("{string:?}");
}
Ok(())
}