aldrin_core/introspection/
event.rs1use super::{ir, resolve_ir, LexicalId};
2use crate::tags::{self, PrimaryTag, Tag};
3use crate::{
4 Deserialize, DeserializeError, Deserializer, Serialize, SerializeError, Serializer, TypeId,
5};
6use num_enum::{IntoPrimitive, TryFromPrimitive};
7use std::collections::BTreeMap;
8
9#[derive(Debug, Clone, PartialEq, Eq)]
10#[cfg_attr(
11 feature = "serde",
12 derive(serde::Serialize, serde::Deserialize),
13 serde(rename_all = "kebab-case")
14)]
15pub struct Event {
16 id: u32,
17 name: String,
18
19 #[cfg_attr(
20 feature = "serde",
21 serde(default, skip_serializing_if = "Option::is_none")
22 )]
23 doc: Option<String>,
24
25 #[cfg_attr(
26 feature = "serde",
27 serde(rename = "type", default, skip_serializing_if = "Option::is_none")
28 )]
29 event_type: Option<TypeId>,
30}
31
32impl Event {
33 pub fn from_ir(ev: ir::EventIr, references: &BTreeMap<LexicalId, TypeId>) -> Self {
34 Self {
35 id: ev.id,
36 name: ev.name,
37 doc: ev.doc,
38 event_type: ev.event_type.map(|ty| resolve_ir(ty, references)),
39 }
40 }
41
42 pub fn id(&self) -> u32 {
43 self.id
44 }
45
46 pub fn name(&self) -> &str {
47 &self.name
48 }
49
50 pub fn doc(&self) -> Option<&str> {
51 self.doc.as_deref()
52 }
53
54 pub fn event_type(&self) -> Option<TypeId> {
55 self.event_type
56 }
57}
58
59#[derive(IntoPrimitive, TryFromPrimitive)]
60#[repr(u32)]
61enum EventField {
62 Id = 0,
63 Name = 1,
64 Doc = 2,
65 EventType = 3,
66}
67
68impl Tag for Event {}
69
70impl PrimaryTag for Event {
71 type Tag = Self;
72}
73
74impl Serialize<Self> for Event {
75 fn serialize(self, serializer: Serializer) -> Result<(), SerializeError> {
76 serializer.serialize(&self)
77 }
78}
79
80impl Serialize<Event> for &Event {
81 fn serialize(self, serializer: Serializer) -> Result<(), SerializeError> {
82 let mut serializer = serializer.serialize_struct2()?;
83
84 serializer.serialize::<tags::U32>(EventField::Id, &self.id)?;
85 serializer.serialize::<tags::String>(EventField::Name, &self.name)?;
86 serializer.serialize_if_some::<tags::Option<tags::String>>(EventField::Doc, &self.doc)?;
87
88 serializer
89 .serialize_if_some::<tags::Option<TypeId>>(EventField::EventType, &self.event_type)?;
90
91 serializer.finish()
92 }
93}
94
95impl Deserialize<Self> for Event {
96 fn deserialize(deserializer: Deserializer) -> Result<Self, DeserializeError> {
97 let mut deserializer = deserializer.deserialize_struct()?;
98
99 let mut id = None;
100 let mut name = None;
101 let mut doc = None;
102 let mut event_type = None;
103
104 while let Some(deserializer) = deserializer.deserialize()? {
105 match deserializer.try_id() {
106 Ok(EventField::Id) => id = deserializer.deserialize::<tags::U32, _>().map(Some)?,
107
108 Ok(EventField::Name) => {
109 name = deserializer.deserialize::<tags::String, _>().map(Some)?;
110 }
111
112 Ok(EventField::Doc) => {
113 doc = deserializer.deserialize::<tags::Option<tags::String>, _>()?;
114 }
115
116 Ok(EventField::EventType) => {
117 event_type = deserializer.deserialize::<tags::Option<TypeId>, _>()?;
118 }
119
120 Err(_) => deserializer.skip()?,
121 }
122 }
123
124 deserializer.finish(Self {
125 id: id.ok_or(DeserializeError::InvalidSerialization)?,
126 name: name.ok_or(DeserializeError::InvalidSerialization)?,
127 doc,
128 event_type,
129 })
130 }
131}