syn_utils/
enum_variant.rs

1use 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}