aldrin_core/introspection/
function.rs1use super::LexicalId;
2use crate::error::{DeserializeError, SerializeError};
3use crate::value_deserializer::{Deserialize, Deserializer};
4use crate::value_serializer::{Serialize, Serializer};
5use num_enum::{IntoPrimitive, TryFromPrimitive};
6
7#[derive(Debug, Clone, PartialEq, Eq, PartialOrd, Ord, Hash)]
8pub struct Function {
9    id: u32,
10    name: String,
11    args: Option<LexicalId>,
12    ok: Option<LexicalId>,
13    err: Option<LexicalId>,
14}
15
16impl Function {
17    pub(super) fn new(
18        id: u32,
19        name: impl Into<String>,
20        args: Option<LexicalId>,
21        ok: Option<LexicalId>,
22        err: Option<LexicalId>,
23    ) -> Self {
24        Self {
25            id,
26            name: name.into(),
27            args,
28            ok,
29            err,
30        }
31    }
32
33    pub fn id(&self) -> u32 {
34        self.id
35    }
36
37    pub fn name(&self) -> &str {
38        &self.name
39    }
40
41    pub fn args(&self) -> Option<LexicalId> {
42        self.args
43    }
44
45    pub fn ok(&self) -> Option<LexicalId> {
46        self.ok
47    }
48
49    pub fn err(&self) -> Option<LexicalId> {
50        self.err
51    }
52}
53
54#[derive(IntoPrimitive, TryFromPrimitive)]
55#[repr(u32)]
56enum FunctionField {
57    Id = 0,
58    Name = 1,
59    Args = 2,
60    Ok = 3,
61    Err = 4,
62}
63
64impl Serialize for Function {
65    fn serialize(&self, serializer: Serializer) -> Result<(), SerializeError> {
66        let mut serializer = serializer.serialize_struct(5)?;
67
68        serializer.serialize_field(FunctionField::Id, &self.id)?;
69        serializer.serialize_field(FunctionField::Name, &self.name)?;
70        serializer.serialize_field(FunctionField::Args, &self.args)?;
71        serializer.serialize_field(FunctionField::Ok, &self.ok)?;
72        serializer.serialize_field(FunctionField::Err, &self.err)?;
73
74        serializer.finish()
75    }
76}
77
78impl Deserialize for Function {
79    fn deserialize(deserializer: Deserializer) -> Result<Self, DeserializeError> {
80        let mut deserializer = deserializer.deserialize_struct()?;
81
82        let mut id = None;
83        let mut name = None;
84        let mut args = None;
85        let mut ok = None;
86        let mut err = None;
87
88        while deserializer.has_more_fields() {
89            let deserializer = deserializer.deserialize_field()?;
90
91            match deserializer.try_id()? {
92                FunctionField::Id => id = deserializer.deserialize().map(Some)?,
93                FunctionField::Name => name = deserializer.deserialize().map(Some)?,
94                FunctionField::Args => args = deserializer.deserialize()?,
95                FunctionField::Ok => ok = deserializer.deserialize()?,
96                FunctionField::Err => err = deserializer.deserialize()?,
97            }
98        }
99
100        deserializer.finish(Self {
101            id: id.ok_or(DeserializeError::InvalidSerialization)?,
102            name: name.ok_or(DeserializeError::InvalidSerialization)?,
103            args,
104            ok,
105            err,
106        })
107    }
108}