| 24 | |
| 25 | impl<'a> Parse<'a> for Attribute { |
| 26 | fn parse<I>(p: &mut Parser<'a, I>) -> ParserResult<Self> |
| 27 | where |
| 28 | I: Iterator<Item = Cursor> + Clone, |
| 29 | { |
| 30 | let open = p.parse::<T!['[']>()?; |
| 31 | let mut namespace_prefix = if p.peek::<T![*|]>() { Some(p.parse::<NamespacePrefix>()?) } else { None }; |
| 32 | let mut attribute = p.parse::<T![Ident]>()?; |
| 33 | let skip = p.set_skip(KindSet::NONE); |
| 34 | // namespace_prefix might be `<Ident> '|' <Ident>` |
| 35 | if namespace_prefix.is_none() && p.peek::<T![|]>() && !p.peek::<T![|=]>() { |
| 36 | let pipe = p.parse::<T![|]>(); |
| 37 | let ident = p.parse::<T![Ident]>(); |
| 38 | p.set_skip(skip); |
| 39 | namespace_prefix = Some(NamespacePrefix::Name(attribute, pipe?)); |
| 40 | attribute = ident?; |
| 41 | } |
| 42 | p.set_skip(skip); |
| 43 | let operator = p.parse_if_peek::<AttributeOperator>()?; |
| 44 | let value = if operator.is_some() { Some(p.parse::<AttributeValue>()?) } else { None }; |
| 45 | let modifier = |
| 46 | if value.is_some() && p.peek::<AttributeModifier>() { Some(p.parse::<AttributeModifier>()?) } else { None }; |
| 47 | let close = p.parse_if_peek::<T![']']>()?; |
| 48 | Ok(Self { open, namespace_prefix, attribute, operator, value, modifier, close }) |
| 49 | } |
| 50 | } |
| 51 | |
| 52 | #[derive(Parse, ToSpan, Peek, ToCursors, SemanticEq, Debug, Clone, PartialEq, Eq, PartialOrd, Ord, Hash)] |