aldrin_core/introspection/
enum_fallback.rs

1use super::ir;
2use crate::tags::{self, PrimaryTag, Tag};
3use crate::{Deserialize, DeserializeError, Deserializer, Serialize, SerializeError, Serializer};
4use num_enum::{IntoPrimitive, TryFromPrimitive};
5
6#[derive(Debug, Clone, PartialEq, Eq)]
7#[cfg_attr(
8    feature = "serde",
9    derive(serde::Serialize, serde::Deserialize),
10    serde(rename_all = "kebab-case")
11)]
12pub struct EnumFallback {
13    name: String,
14
15    #[cfg_attr(
16        feature = "serde",
17        serde(default, skip_serializing_if = "Option::is_none")
18    )]
19    doc: Option<String>,
20}
21
22impl EnumFallback {
23    pub fn from_ir(fallback: ir::EnumFallbackIr) -> Self {
24        Self {
25            name: fallback.name,
26            doc: fallback.doc,
27        }
28    }
29
30    pub fn name(&self) -> &str {
31        &self.name
32    }
33
34    pub fn doc(&self) -> Option<&str> {
35        self.doc.as_deref()
36    }
37}
38
39#[derive(IntoPrimitive, TryFromPrimitive)]
40#[repr(u32)]
41enum EnumFallbackField {
42    Name = 0,
43    Doc = 1,
44}
45
46impl Tag for EnumFallback {}
47
48impl PrimaryTag for EnumFallback {
49    type Tag = Self;
50}
51
52impl Serialize<Self> for EnumFallback {
53    fn serialize(self, serializer: Serializer) -> Result<(), SerializeError> {
54        serializer.serialize(&self)
55    }
56}
57
58impl Serialize<EnumFallback> for &EnumFallback {
59    fn serialize(self, serializer: Serializer) -> Result<(), SerializeError> {
60        let mut serializer = serializer.serialize_struct2()?;
61
62        serializer.serialize::<tags::String>(EnumFallbackField::Name, &self.name)?;
63
64        serializer
65            .serialize_if_some::<tags::Option<tags::String>>(EnumFallbackField::Doc, &self.doc)?;
66
67        serializer.finish()
68    }
69}
70
71impl Deserialize<Self> for EnumFallback {
72    fn deserialize(deserializer: Deserializer) -> Result<Self, DeserializeError> {
73        let mut deserializer = deserializer.deserialize_struct()?;
74
75        let mut name = None;
76        let mut doc = None;
77
78        while let Some(deserializer) = deserializer.deserialize()? {
79            match deserializer.try_id() {
80                Ok(EnumFallbackField::Name) => {
81                    name = deserializer.deserialize::<tags::String, _>().map(Some)?;
82                }
83
84                Ok(EnumFallbackField::Doc) => {
85                    doc = deserializer.deserialize::<tags::Option<tags::String>, _>()?;
86                }
87
88                Err(_) => deserializer.skip()?,
89            }
90        }
91
92        deserializer.finish(Self {
93            name: name.ok_or(DeserializeError::InvalidSerialization)?,
94            doc,
95        })
96    }
97}