1 | use syn::{ |
2 | parse::{Parse, ParseStream}, |
3 | Expr, Result, |
4 | }; |
5 | |
6 | mod kw { |
7 | syn::custom_keyword!(default); |
8 | syn::custom_keyword!(catch_all); |
9 | syn::custom_keyword!(alternatives); |
10 | } |
11 | |
12 | pub(crate) struct NumEnumVariantAttributes { |
13 | pub(crate) items: syn::punctuated::Punctuated<NumEnumVariantAttributeItem, syn::Token![,]>, |
14 | } |
15 | |
16 | impl Parse for NumEnumVariantAttributes { |
17 | fn parse(input: ParseStream<'_>) -> Result<Self> { |
18 | Ok(Self { |
19 | items: input.parse_terminated(parser:NumEnumVariantAttributeItem::parse, separator:syn::Token![,])?, |
20 | }) |
21 | } |
22 | } |
23 | |
24 | pub(crate) enum NumEnumVariantAttributeItem { |
25 | Default(VariantDefaultAttribute), |
26 | CatchAll(VariantCatchAllAttribute), |
27 | Alternatives(VariantAlternativesAttribute), |
28 | } |
29 | |
30 | impl Parse for NumEnumVariantAttributeItem { |
31 | fn parse(input: ParseStream<'_>) -> Result<Self> { |
32 | let lookahead: Lookahead1<'_> = input.lookahead1(); |
33 | if lookahead.peek(token:kw::default) { |
34 | input.parse().map(Self::Default) |
35 | } else if lookahead.peek(token:kw::catch_all) { |
36 | input.parse().map(Self::CatchAll) |
37 | } else if lookahead.peek(token:kw::alternatives) { |
38 | input.parse().map(Self::Alternatives) |
39 | } else { |
40 | Err(lookahead.error()) |
41 | } |
42 | } |
43 | } |
44 | |
45 | pub(crate) struct VariantDefaultAttribute { |
46 | pub(crate) keyword: kw::default, |
47 | } |
48 | |
49 | impl Parse for VariantDefaultAttribute { |
50 | fn parse(input: ParseStream) -> Result<Self> { |
51 | Ok(Self { |
52 | keyword: input.parse()?, |
53 | }) |
54 | } |
55 | } |
56 | |
57 | pub(crate) struct VariantCatchAllAttribute { |
58 | pub(crate) keyword: kw::catch_all, |
59 | } |
60 | |
61 | impl Parse for VariantCatchAllAttribute { |
62 | fn parse(input: ParseStream) -> Result<Self> { |
63 | Ok(Self { |
64 | keyword: input.parse()?, |
65 | }) |
66 | } |
67 | } |
68 | |
69 | pub(crate) struct VariantAlternativesAttribute { |
70 | _keyword: kw::alternatives, |
71 | _eq_token: syn::Token![=], |
72 | _bracket_token: syn::token::Bracket, |
73 | pub(crate) expressions: syn::punctuated::Punctuated<Expr, syn::Token![,]>, |
74 | } |
75 | |
76 | impl Parse for VariantAlternativesAttribute { |
77 | fn parse(input: ParseStream) -> Result<Self> { |
78 | let content: ParseBuffer<'_>; |
79 | let keyword: alternatives = input.parse()?; |
80 | let _eq_token: Eq = input.parse()?; |
81 | let _bracket_token: Bracket = syn::bracketed!(content in input); |
82 | let expressions: Punctuated = content.parse_terminated(parser:Expr::parse, separator:syn::Token![,])?; |
83 | Ok(Self { |
84 | _keyword: keyword, |
85 | _eq_token, |
86 | _bracket_token, |
87 | expressions, |
88 | }) |
89 | } |
90 | } |
91 | |