aldrin_core/introspection/ir/
variant.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 VariantIr {
8    pub(crate) id: u32,
9    pub(crate) name: String,
10    pub(crate) doc: Option<String>,
11    pub(crate) variant_type: Option<LexicalId>,
12}
13
14impl VariantIr {
15    pub fn builder(id: u32, name: impl Into<String>) -> VariantIrBuilder {
16        VariantIrBuilder::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 variant_type(&self) -> Option<LexicalId> {
32        self.variant_type
33    }
34}
35
36#[derive(IntoPrimitive, TryFromPrimitive)]
37#[repr(u32)]
38enum VariantField {
39    Id = 0,
40    Name = 1,
41    VariantType = 2,
42}
43
44impl Tag for VariantIr {}
45
46impl PrimaryTag for VariantIr {
47    type Tag = Self;
48}
49
50impl Serialize<VariantIr> for &VariantIr {
51    fn serialize(self, serializer: Serializer) -> Result<(), SerializeError> {
52        let mut serializer = serializer.serialize_struct2()?;
53
54        serializer.serialize::<tags::U32>(VariantField::Id, &self.id)?;
55        serializer.serialize::<tags::String>(VariantField::Name, &self.name)?;
56
57        serializer.serialize_if_some::<tags::Option<LexicalId>>(
58            VariantField::VariantType,
59            &self.variant_type,
60        )?;
61
62        serializer.finish()
63    }
64}
65
66#[derive(Debug, Clone)]
67pub struct VariantIrBuilder {
68    id: u32,
69    name: String,
70    doc: Option<String>,
71    variant_type: Option<LexicalId>,
72}
73
74impl VariantIrBuilder {
75    pub fn new(id: u32, name: impl Into<String>) -> Self {
76        Self {
77            id,
78            name: name.into(),
79            doc: None,
80            variant_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 variant_type(mut self, variant_type: LexicalId) -> Self {
90        self.variant_type = Some(variant_type);
91        self
92    }
93
94    pub fn finish(self) -> VariantIr {
95        VariantIr {
96            id: self.id,
97            name: self.name,
98            doc: self.doc,
99            variant_type: self.variant_type,
100        }
101    }
102}