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}