aldrin_core/introspection/ir/
function.rs

1use 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}