syn_utils/
enum_variant.rs1use crate::*;
2
3pub trait EnumVariant {
4 fn has_single_item(&self) -> bool;
5 fn is_unit(&self) -> bool;
6 fn typ(&self) -> syn::Result<&Type>;
7 fn type_mut(&mut self) -> syn::Result<&mut Type>;
8 fn type_path(&self) -> syn::Result<&Path>;
9 fn type_path_mut(&mut self) -> syn::Result<&mut Path>;
10 fn named_fields(&self) -> syn::Result<&Punctuated<Field, Token![,]>>;
11 fn named_fields_mut(&mut self) -> syn::Result<&mut Punctuated<Field, Token![,]>>;
12 fn unnamed_fields(&self) -> syn::Result<&Punctuated<Field, Token![,]>>;
13 fn unnamed_fields_mut(&mut self) -> syn::Result<&mut Punctuated<Field, Token![,]>>;
14}
15
16impl EnumVariant for Variant {
17 fn has_single_item(&self) -> bool {
18 if let Fields::Unnamed(fields) = &self.fields && fields.unnamed.len() == 1 {
19 true
20 } else {
21 false
22 }
23 }
24
25 fn type_path_mut(&mut self) -> syn::Result<&mut Path> {
26 let span = self.span();
27
28 if let Fields::Unnamed(fields) = &mut self.fields && fields.unnamed.len() == 1 {
29 Ok(fields.unnamed.last_mut().unwrap().ty.as_path_mut()?)
30 } else {
31 bail_with_span!(span, "Expected this variant to have a single unnamed field");
32 }
33 }
34
35 fn type_mut(&mut self) -> syn::Result<&mut Type> {
36 let span = self.span();
37
38 if let Fields::Unnamed(fields) = &mut self.fields && fields.unnamed.len() == 1 {
39 Ok(&mut fields.unnamed.last_mut().unwrap().ty)
40 } else {
41 bail_with_span!(span, "Expected this variant to have a single unnamed field");
42 }
43 }
44
45 fn type_path(&self) -> syn::Result<&Path> {
46 if let Fields::Unnamed(fields) = &self.fields && fields.unnamed.len() == 1 {
47 Ok(fields.unnamed.last().unwrap().ty.as_path()?)
48 } else {
49 bail!(self, "Expected this variant to have a single unnamed field");
50 }
51 }
52
53 fn typ(&self) -> syn::Result<&Type> {
54 if let Fields::Unnamed(fields) = &self.fields && fields.unnamed.len() == 1 {
55 Ok(&fields.unnamed.last().unwrap().ty)
56 } else {
57 bail!(self, "Expected this variant to have a single unnamed field");
58 }
59 }
60
61 fn is_unit(&self) -> bool {
62 matches!(self.fields, Fields::Unit)
63 }
64
65 fn named_fields(&self) -> syn::Result<&Punctuated<Field, Token![,]>> {
66 if let Fields::Named(fields) = &self.fields {
67 Ok(&fields.named)
68 } else {
69 bail!(self, "Expected this variant to have named fields");
70 }
71 }
72
73 fn named_fields_mut(&mut self) -> syn::Result<&mut Punctuated<Field, Token![,]>> {
74 let span = self.span();
75
76 if let Fields::Named(fields) = &mut self.fields {
77 Ok(&mut fields.named)
78 } else {
79 bail_with_span!(span, "Expected this variant to have named fields");
80 }
81 }
82
83 fn unnamed_fields(&self) -> syn::Result<&Punctuated<Field, token::Comma>> {
84 if let Fields::Unnamed(fields) = &self.fields {
85 Ok(&fields.unnamed)
86 } else {
87 bail!(self, "Expected this variant to have unnamed fields");
88 }
89 }
90
91 fn unnamed_fields_mut(&mut self) -> syn::Result<&mut Punctuated<Field, Token![,]>> {
92 let span = self.span();
93
94 if let Fields::Unnamed(fields) = &mut self.fields {
95 Ok(&mut fields.unnamed)
96 } else {
97 bail_with_span!(span, "Expected this variant to have unnamed fields");
98 }
99 }
100}