aldrin_core/introspection/
enum_fallback.rs1use 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}