#[macro_export]
macro_rules! selectors {
($( $vis:vis $name:ident = $css:literal; )+) => { $(
$vis fn $name() -> &'static $crate::scraper::Selector {
static SELECTOR: ::std::sync::OnceLock<$crate::scraper::Selector> = ::std::sync::OnceLock::new();
SELECTOR.get_or_init(|| {
$crate::scraper::Selector::parse($css)
.unwrap_or_else(|error| panic!("invalid CSS selector {:?}: {error:?}", $css))
})
}
)+ };
}
#[cfg(test)]
mod tests {
crate::selectors! {
test_selector = "a.detail[href]";
invalid_selector = "a[";
}
#[test]
fn returns_same_static_selector() {
assert!(std::ptr::eq(test_selector(), test_selector()));
}
#[test]
#[should_panic(expected = "invalid CSS selector")]
fn invalid_selector_panics_on_first_use() {
let _ = invalid_selector();
}
}