aldrin_core/introspection/
function_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 FunctionFallback {
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 FunctionFallback {
23 pub fn from_ir(fallback: ir::FunctionFallbackIr) -> 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 FunctionFallbackField {
42 Name = 0,
43 Doc = 1,
44}
45
46impl Tag for FunctionFallback {}
47
48impl PrimaryTag for FunctionFallback {
49 type Tag = Self;
50}
51
52impl Serialize<Self> for FunctionFallback {
53 fn serialize(self, serializer: Serializer) -> Result<(), SerializeError> {
54 serializer.serialize(&self)
55 }
56}
57
58impl Serialize<FunctionFallback> for &FunctionFallback {
59 fn serialize(self, serializer: Serializer) -> Result<(), SerializeError> {
60 let mut serializer = serializer.serialize_struct2()?;
61
62 serializer.serialize::<tags::String>(FunctionFallbackField::Name, &self.name)?;
63
64 serializer.serialize_if_some::<tags::Option<tags::String>>(
65 FunctionFallbackField::Doc,
66 &self.doc,
67 )?;
68
69 serializer.finish()
70 }
71}
72
73impl Deserialize<Self> for FunctionFallback {
74 fn deserialize(deserializer: Deserializer) -> Result<Self, DeserializeError> {
75 let mut deserializer = deserializer.deserialize_struct()?;
76
77 let mut name = None;
78 let mut doc = None;
79
80 while let Some(deserializer) = deserializer.deserialize()? {
81 match deserializer.try_id() {
82 Ok(FunctionFallbackField::Name) => {
83 name = deserializer.deserialize::<tags::String, _>().map(Some)?;
84 }
85
86 Ok(FunctionFallbackField::Doc) => {
87 doc = deserializer.deserialize::<tags::Option<tags::String>, _>()?;
88 }
89
90 Err(_) => deserializer.skip()?,
91 }
92 }
93
94 deserializer.finish(Self {
95 name: name.ok_or(DeserializeError::InvalidSerialization)?,
96 doc,
97 })
98 }
99}