checked_rs_macro_impl/item/enum_item/
variant.rs

1use proc_macro2::TokenStream;
2use quote::ToTokens;
3use syn::parse::Parse;
4
5use crate::params::{kw, NumberArg};
6
7use super::ClampedEnumVariantField;
8
9#[derive(Clone)]
10pub struct ClampedEnumVariant {
11    pub pound: Option<syn::Token![#]>,
12    pub bracket: Option<syn::token::Bracket>,
13    pub default_kw: Option<kw::default>,
14    pub default_eq: Option<syn::Token![=]>,
15    pub default_val: Option<NumberArg>,
16    pub ident: syn::Ident,
17    pub field: ClampedEnumVariantField,
18}
19
20impl Parse for ClampedEnumVariant {
21    fn parse(input: syn::parse::ParseStream) -> syn::Result<Self> {
22        let mut pound = None;
23        let mut bracket = None;
24        let mut default_kw = None;
25        let mut default_eq = None;
26        let mut default_val = None;
27
28        if input.peek(syn::Token![#]) {
29            pound = Some(input.parse()?);
30
31            let content;
32            bracket = Some(syn::bracketed!(content in input));
33            default_kw = Some(content.parse()?);
34            default_eq = Some(content.parse()?);
35            default_val = Some(content.parse()?);
36        }
37
38        Ok(Self {
39            pound,
40            bracket,
41            default_kw,
42            default_eq,
43            default_val,
44            ident: input.parse()?,
45            field: input.parse()?,
46        })
47    }
48}
49
50impl ToTokens for ClampedEnumVariant {
51    fn to_tokens(&self, tokens: &mut TokenStream) {
52        if let Some(pound) = &self.pound {
53            pound.to_tokens(tokens);
54            self.bracket.as_ref().unwrap().surround(tokens, |tokens| {
55                self.default_kw.to_tokens(tokens);
56                self.default_eq.to_tokens(tokens);
57                self.default_val.to_tokens(tokens);
58            });
59        }
60
61        self.ident.to_tokens(tokens);
62        self.field.to_tokens(tokens);
63    }
64}
65
66impl std::fmt::Debug for ClampedEnumVariant {
67    fn fmt(&self, f: &mut std::fmt::Formatter) -> std::fmt::Result {
68        f.debug_struct("ClampedEnumVariant")
69            .field("default_val", &self.default_val)
70            .field("ident", &self.ident)
71            .field("field", &self.field)
72            .finish_non_exhaustive()
73    }
74}