checked_rs_macro_impl/item/enum_item/
variant.rs1use 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}