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