assert_type_match/
variants.rs

1use 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    /// Controls whether the annotated variant should be skipped.
12    pub fn skip(&self) -> bool {
13        flag_to_bool(&self.skip)
14    }
15
16    /// Merges two sets of [variant arguments].
17    ///
18    /// [variant arguments]: Self
19    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}