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