aldrin_core/introspection/ir/
event.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 EventIr {
8 pub(crate) id: u32,
9 pub(crate) name: String,
10 pub(crate) doc: Option<String>,
11 pub(crate) event_type: Option<LexicalId>,
12}
13
14impl EventIr {
15 pub fn builder(id: u32, name: impl Into<String>) -> EventIrBuilder {
16 EventIrBuilder::new(id, name)
17 }
18
19 pub fn id(&self) -> u32 {
20 self.id
21 }
22
23 pub fn name(&self) -> &str {
24 &self.name
25 }
26
27 pub fn doc(&self) -> Option<&str> {
28 self.doc.as_deref()
29 }
30
31 pub fn event_type(&self) -> Option<LexicalId> {
32 self.event_type
33 }
34}
35
36#[derive(IntoPrimitive, TryFromPrimitive)]
37#[repr(u32)]
38enum EventField {
39 Id = 0,
40 Name = 1,
41 EventType = 2,
42}
43
44impl Tag for EventIr {}
45
46impl PrimaryTag for EventIr {
47 type Tag = Self;
48}
49
50impl Serialize<EventIr> for &EventIr {
51 fn serialize(self, serializer: Serializer) -> Result<(), SerializeError> {
52 let mut serializer = serializer.serialize_struct2()?;
53
54 serializer.serialize::<tags::U32>(EventField::Id, &self.id)?;
55 serializer.serialize::<tags::String>(EventField::Name, &self.name)?;
56
57 serializer.serialize_if_some::<tags::Option<LexicalId>>(
58 EventField::EventType,
59 &self.event_type,
60 )?;
61
62 serializer.finish()
63 }
64}
65
66#[derive(Debug, Clone)]
67pub struct EventIrBuilder {
68 id: u32,
69 name: String,
70 doc: Option<String>,
71 event_type: Option<LexicalId>,
72}
73
74impl EventIrBuilder {
75 pub fn new(id: u32, name: impl Into<String>) -> Self {
76 Self {
77 id,
78 name: name.into(),
79 doc: None,
80 event_type: None,
81 }
82 }
83
84 pub fn doc(mut self, doc: impl Into<String>) -> Self {
85 self.doc = Some(doc.into());
86 self
87 }
88
89 pub fn event_type(mut self, event_type: LexicalId) -> Self {
90 self.event_type = Some(event_type);
91 self
92 }
93
94 pub fn finish(self) -> EventIr {
95 EventIr {
96 id: self.id,
97 name: self.name,
98 doc: self.doc,
99 event_type: self.event_type,
100 }
101 }
102}