use crate::error::StubrResult;
use rand::{Rng, SeedableRng};
use rand_xorshift::XorShiftRng;
use regex_syntax::ParserBuilder;
pub struct RegexRndGenerator<'a>(pub &'a str);
impl RegexRndGenerator<'_> {
pub fn try_generate(self) -> StubrResult<String> {
const MAX_REPEAT: u32 = 10;
let mut rng = XorShiftRng::seed_from_u64(42);
let mut parser = ParserBuilder::new().unicode(false).build();
let hir = parser.parse(self.0).map_err(Box::new)?;
let gen = rand_regex::Regex::with_hir(hir, MAX_REPEAT).map_err(Box::new)?;
Ok(rng.sample::<String, _>(&gen))
}
}
#[cfg(test)]
mod verify_regex_tests {
use super::*;
#[test]
fn should_respect_type_and_length() {
let sample: String = RegexRndGenerator("([a-z]{10})").try_generate().unwrap();
assert_eq!(sample.len(), 10);
assert!(sample.chars().all(|c| c.is_ascii()))
}
}