css_parse/macros/
pseudo_element.rs1#[macro_export]
46macro_rules! pseudo_element {
47 ($(#[$meta:meta])* $vis:vis enum $name: ident { $first_variant: ident: $atoms: ident::$first:ident, $( $variant: ident: $variant_pat: pat$(,)?)* }) => {
48 $(#[$meta])*
49 $vis enum $name {
50 $first_variant($crate::T![::], $crate::T![Ident]),
51 $($variant($crate::T![::], $crate::T![Ident]),)*
52 }
53
54 impl<'a> $crate::Peek<'a> for $name {
55 const PEEK_KINDSET: $crate::KindSet = $crate::KindSet::new(&[$crate::Kind::Colon]);
56
57 #[inline(always)]
58 fn peek<I>(p: &$crate::Parser<'a, I>, c: $crate::Cursor) -> bool
59 where
60 I: Iterator<Item = $crate::Cursor> + Clone,
61 {
62 let c2 = p.peek_n_including_whitespace(2);
63 let c3 = p.peek_n_including_whitespace(3);
64 c == $crate::Kind::Colon
65 && c2 == $crate::Kind::Colon
66 && c3 == $crate::Kind::Ident
67 && matches!(p.to_atom::<$atoms>(c3), $atoms::$first $(| $variant_pat)*)
68 }
69 }
70
71 impl<'a> $crate::Parse<'a> for $name {
72 fn parse<I>(p: &mut $crate::Parser<'a, I>) -> $crate::Result<Self>
73 where
74 I: Iterator<Item = $crate::Cursor> + Clone,
75 {
76 let colons = p.parse::<$crate::T![::]>()?;
77 let skip = p.set_skip($crate::KindSet::NONE);
78 let ident = p.parse::<$crate::T![Ident]>();
79 p.set_skip(skip);
80 let ident = ident?;
81 match p.to_atom::<$atoms>(ident.into()) {
82 $atoms::$first => Ok(Self::$first_variant(colons, ident)),
83 $($variant_pat => Ok(Self::$variant(colons, ident)),)*
84 _ => {
85 use $crate::ToSpan;
86 Err($crate::Diagnostic::new(ident.into(), Diagnostic::unexpected_ident))?
87 }
88 }
89 }
90 }
91 }
92}