aldrin_core/introspection/ir/
enum_ty.rs

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