scarf_parser/parser/general/
attributes.rs1use crate::*;
7use chumsky::prelude::*;
8use scarf_syntax::*;
9
10pub fn attribute_instance_parser<'a, I>()
11-> impl Parser<'a, I, AttributeInstance<'a>, ParserError<'a>>
12where
13 I: ValueInput<'a, Token = Token<'a>, Span = SimpleSpan>,
14{
15 token(Token::ParenStar)
16 .then(attr_spec_parser())
17 .then(
18 token(Token::Comma)
19 .then(attr_spec_parser())
20 .repeated()
21 .collect::<Vec<(Metadata<'a>, AttrSpec<'a>)>>(),
22 )
23 .then(token(Token::StarEparen))
24 .map(|(((a, b), c), d)| AttributeInstance(a, b, c, d))
25}
26
27pub fn attr_spec_parser<'a, I>() -> impl Parser<'a, I, AttrSpec<'a>, ParserError<'a>>
28where
29 I: ValueInput<'a, Token = Token<'a>, Span = SimpleSpan>,
30{
31 attr_name_parser()
32 .then(token(Token::Eq).then(constant_expression_parser()).or_not())
33 .map(|(a, b)| AttrSpec(a, b))
34}
35
36pub fn attr_name_parser<'a, I>() -> impl Parser<'a, I, AttrName<'a>, ParserError<'a>>
37where
38 I: ValueInput<'a, Token = Token<'a>, Span = SimpleSpan>,
39{
40 identifier_parser().map(|a| AttrName(a))
41}