syn_utils/
field_or_variant.rs1use crate::*;
2
3#[derive(PartialEq, Debug)]
4pub enum FieldOrVariant<'a> {
5 Field(&'a mut Field),
6 Variant(&'a mut Variant),
7}
8
9impl<'a> FieldOrVariant<'a> {
10 pub fn ident(&self) -> syn::Result<&Ident> {
11 match self {
12 FieldOrVariant::Field(field) => field.require_ident(),
13 FieldOrVariant::Variant(variant) => Ok(&variant.ident),
14 }
15 }
16
17 pub fn get_type(&self) -> syn::Result<&Type> {
18 let output = match self {
19 FieldOrVariant::Field(field) => &field.ty,
20 FieldOrVariant::Variant(variant) => variant.type_()?,
21 };
22
23 Ok(output)
24 }
25
26 pub fn type_mut(&mut self) -> syn::Result<&mut Type> {
27 let output = match self {
28 FieldOrVariant::Field(field) => &mut field.ty,
29 FieldOrVariant::Variant(variant) => variant.type_mut()?,
30 };
31
32 Ok(output)
33 }
34
35 pub fn inject_attr(&mut self, attr: Attribute) {
36 match self {
37 FieldOrVariant::Field(field) => field.attrs.push(attr),
38 FieldOrVariant::Variant(variant) => variant.attrs.push(attr),
39 }
40 }
41
42 pub fn change_type(&mut self, ty: Type) -> syn::Result<()> {
43 let src_type = self.type_mut()?;
44
45 *src_type = ty;
46
47 Ok(())
48 }
49
50 #[must_use]
54 pub fn is_field(&self) -> bool {
55 matches!(self, Self::Field(..))
56 }
57
58 #[must_use]
62 pub fn is_variant(&self) -> bool {
63 matches!(self, Self::Variant(..))
64 }
65
66 pub fn as_field(&self) -> Option<&&'a mut Field> {
67 if let Self::Field(v) = self {
68 Some(v)
69 } else {
70 None
71 }
72 }
73
74 pub fn as_variant(&self) -> Option<&&'a mut Variant> {
75 if let Self::Variant(v) = self {
76 Some(v)
77 } else {
78 None
79 }
80 }
81}