aldrin_core/introspection/ir/
function.rs1use super::LexicalId;
2use crate::tags::{self, PrimaryTag, Tag};
3use crate::{Serialize, SerializeError, Serializer};
4use num_enum::{IntoPrimitive, TryFromPrimitive};
5
6#[derive(Debug, Clone)]
7pub struct FunctionIr {
8 pub(crate) id: u32,
9 pub(crate) name: String,
10 pub(crate) doc: Option<String>,
11 pub(crate) args: Option<LexicalId>,
12 pub(crate) ok: Option<LexicalId>,
13 pub(crate) err: Option<LexicalId>,
14}
15
16impl FunctionIr {
17 pub fn builder(id: u32, name: impl Into<String>) -> FunctionIrBuilder {
18 FunctionIrBuilder::new(id, name)
19 }
20
21 pub fn id(&self) -> u32 {
22 self.id
23 }
24
25 pub fn name(&self) -> &str {
26 &self.name
27 }
28
29 pub fn doc(&self) -> Option<&str> {
30 self.doc.as_deref()
31 }
32
33 pub fn args(&self) -> Option<LexicalId> {
34 self.args
35 }
36
37 pub fn ok(&self) -> Option<LexicalId> {
38 self.ok
39 }
40
41 pub fn err(&self) -> Option<LexicalId> {
42 self.err
43 }
44}
45
46#[derive(IntoPrimitive, TryFromPrimitive)]
47#[repr(u32)]
48enum FunctionField {
49 Id = 0,
50 Name = 1,
51 Args = 2,
52 Ok = 3,
53 Err = 4,
54}
55
56impl Tag for FunctionIr {}
57
58impl PrimaryTag for FunctionIr {
59 type Tag = Self;
60}
61
62impl Serialize<FunctionIr> for &FunctionIr {
63 fn serialize(self, serializer: Serializer) -> Result<(), SerializeError> {
64 let mut serializer = serializer.serialize_struct2()?;
65
66 serializer.serialize::<tags::U32>(FunctionField::Id, &self.id)?;
67 serializer.serialize::<tags::String>(FunctionField::Name, &self.name)?;
68 serializer.serialize_if_some::<tags::Option<LexicalId>>(FunctionField::Args, &self.args)?;
69 serializer.serialize_if_some::<tags::Option<LexicalId>>(FunctionField::Ok, &self.ok)?;
70 serializer.serialize_if_some::<tags::Option<LexicalId>>(FunctionField::Err, &self.err)?;
71
72 serializer.finish()
73 }
74}
75
76#[derive(Debug, Clone)]
77pub struct FunctionIrBuilder {
78 id: u32,
79 name: String,
80 doc: Option<String>,
81 args: Option<LexicalId>,
82 ok: Option<LexicalId>,
83 err: Option<LexicalId>,
84}
85
86impl FunctionIrBuilder {
87 pub fn new(id: u32, name: impl Into<String>) -> Self {
88 Self {
89 id,
90 name: name.into(),
91 doc: None,
92 args: None,
93 ok: None,
94 err: None,
95 }
96 }
97
98 pub fn doc(mut self, doc: impl Into<String>) -> Self {
99 self.doc = Some(doc.into());
100 self
101 }
102
103 pub fn args(mut self, args: LexicalId) -> Self {
104 self.args = Some(args);
105 self
106 }
107
108 pub fn ok(mut self, ok: LexicalId) -> Self {
109 self.ok = Some(ok);
110 self
111 }
112
113 pub fn err(mut self, err: LexicalId) -> Self {
114 self.err = Some(err);
115 self
116 }
117
118 pub fn finish(self) -> FunctionIr {
119 FunctionIr {
120 id: self.id,
121 name: self.name,
122 doc: self.doc,
123 args: self.args,
124 ok: self.ok,
125 err: self.err,
126 }
127 }
128}