#[macro_export]
macro_rules! lazy_regex {
( $( $re:expr ),+ ) => {{
static RE: ::once_cell::sync::OnceCell<regex::Regex> = ::once_cell::sync::OnceCell::new();
RE.get_or_init(|| {
let s: String = [ $( $re ),+ ].concat();
::regex::Regex::new(&*s).expect("regex to compile")
})
}};
}
#[cfg(test)]
mod tests {
use regex::Regex;
#[test]
fn assert_equality_on_multiple_calls() {
let regexes = (0..=1).map(|_| lazy_regex!("foo"))
.collect::<Vec<&'static Regex>>();
let re1: &'static Regex = regexes[0];
let re2: &'static Regex = regexes[1];
assert!(std::ptr::eq(re1, re2));
}
#[test]
fn concat_examples() {
assert!(lazy_regex!("a").is_match("a"));
assert!(lazy_regex!("a", "b").is_match("ab"));
const X: &'static str = "x";
assert!(lazy_regex!("a", X, "b").is_match("axb"));
let local_string: String = String::from("foo");
let local_str: &str = local_string.as_str();
assert!(lazy_regex!(local_str).is_match("foo"));
}
}