assert_type_match/
variants.rs1use crate::flags::{flag_to_bool, merge_flags, Flag, ParseFlag};
2use syn::parse::{Parse, ParseStream};
3use syn::Token;
4
5#[derive(Default)]
6pub(crate) struct VariantArgs {
7 skip: Flag,
8}
9
10impl VariantArgs {
11 pub fn skip(&self) -> bool {
13 flag_to_bool(&self.skip)
14 }
15
16 pub fn merge(self, other: Self) -> syn::Result<Self> {
20 let skip = merge_flags::<kw::skip>(self.skip, other.skip)?;
21
22 Ok(Self { skip })
23 }
24}
25
26impl Parse for VariantArgs {
27 fn parse(input: ParseStream) -> syn::Result<Self> {
28 let mut this = Self { skip: None };
29
30 loop {
31 let lookahead = input.lookahead1();
32 if lookahead.peek(kw::skip) {
33 this.skip = input.parse_flag::<kw::skip>()?;
34 } else {
35 return Err(lookahead.error());
36 }
37
38 if input.peek(Token![,]) {
39 input.parse::<Token![,]>()?;
40
41 if input.is_empty() {
42 break;
43 }
44 } else {
45 break;
46 }
47 }
48
49 Ok(this)
50 }
51}
52
53mod kw {
54 syn::custom_keyword!(skip);
55}