syn_utils/
field_or_variant.rs

1use 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  /// Returns `true` if the field or variant is [`Field`].
51  ///
52  /// [`Field`]: FieldOrVariant::Field
53  #[must_use]
54  pub fn is_field(&self) -> bool {
55    matches!(self, Self::Field(..))
56  }
57
58  /// Returns `true` if the field or variant is [`Variant`].
59  ///
60  /// [`Variant`]: FieldOrVariant::Variant
61  #[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}