#[macro_export]
macro_rules! pseudo_class {
($(#[$meta:meta])* $vis:vis enum $name: ident { $first_variant: ident: $atoms: ident::$first:ident, $( $variant: ident: $variant_pat: pat$(,)?)* }) => {
$(#[$meta])*
pub enum $name {
$first_variant($crate::T![:], $crate::T![Ident]),
$($variant($crate::T![:], $crate::T![Ident]),)*
}
impl<'a> $crate::Peek<'a> for $name {
fn peek<I>(p: &$crate::Parser<'a, I>, c: $crate::Cursor) -> bool
where
I: Iterator<Item = $crate::Cursor> + Clone,
{
let c2 = p.peek_n(2);
c == $crate::Kind::Colon &&
c2 == $crate::Kind::Ident &&
matches!(p.to_atom::<$atoms>(c2), $atoms::$first $(| $variant_pat)*)
}
}
impl<'a> $crate::Parse<'a> for $name {
fn parse<I>(p: &mut $crate::Parser<'a, I>) -> $crate::Result<Self>
where
I: Iterator<Item = $crate::Cursor> + Clone,
{
let colon = p.parse::<$crate::T![:]>()?;
let skip = p.set_skip($crate::KindSet::NONE);
let ident = p.parse::<$crate::T![Ident]>();
p.set_skip(skip);
let ident = ident?;
match p.to_atom::<$atoms>(ident.into()) {
$atoms::$first => Ok(Self::$first_variant(colon, ident)),
$($variant_pat => Ok(Self::$variant(colon, ident)),)*
_ => {
Err($crate::Diagnostic::new(ident.into(), $crate::Diagnostic::unexpected_ident))?
}
}
}
}
}
}