MCPcopy Create free account
hub / github.com/csskit/csskit / parse

Method parse

crates/css_ast/src/selector/attribute.rs:26–49  ·  view source on GitHub ↗
(p: &mut Parser<'a, I>)

Source from the content-addressed store, hash-verified

24
25impl<'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)]

Callers

nothing calls this directly

Calls 1

set_skipMethod · 0.80

Tested by

no test coverage detected