aldrin_core/introspection/ir/
struct_ty.rs

1use super::{FieldIr, LexicalId, StructFallbackIr};
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 StructIr {
10    pub(crate) schema: String,
11    pub(crate) name: String,
12    pub(crate) doc: Option<String>,
13    pub(crate) fields: BTreeMap<u32, FieldIr>,
14    pub(crate) fallback: Option<StructFallbackIr>,
15}
16
17impl StructIr {
18    pub const NAMESPACE: Uuid = uuid!("83742d78-4e60-44b2-84e7-75904c5987c1");
19
20    pub fn builder(schema: impl Into<String>, name: impl Into<String>) -> StructIrBuilder {
21        StructIrBuilder::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 fields(&self) -> &BTreeMap<u32, FieldIr> {
41        &self.fields
42    }
43
44    pub fn fallback(&self) -> Option<&StructFallbackIr> {
45        self.fallback.as_ref()
46    }
47}
48
49#[derive(IntoPrimitive, TryFromPrimitive)]
50#[repr(u32)]
51enum StructField {
52    Schema = 0,
53    Name = 1,
54    Fields = 2,
55    Fallback = 3,
56}
57
58impl Tag for StructIr {}
59
60impl PrimaryTag for StructIr {
61    type Tag = Self;
62}
63
64impl Serialize<StructIr> for &StructIr {
65    fn serialize(self, serializer: Serializer) -> Result<(), SerializeError> {
66        let mut serializer = serializer.serialize_struct2()?;
67
68        serializer.serialize::<tags::String>(StructField::Schema, &self.schema)?;
69        serializer.serialize::<tags::String>(StructField::Name, &self.name)?;
70        serializer.serialize::<tags::Map<tags::U32, FieldIr>>(StructField::Fields, &self.fields)?;
71
72        serializer.serialize_if_some::<tags::Option<StructFallbackIr>>(
73            StructField::Fallback,
74            &self.fallback,
75        )?;
76
77        serializer.finish()
78    }
79}
80
81#[derive(Debug, Clone)]
82pub struct StructIrBuilder {
83    schema: String,
84    name: String,
85    doc: Option<String>,
86    fields: BTreeMap<u32, FieldIr>,
87    fallback: Option<StructFallbackIr>,
88}
89
90impl StructIrBuilder {
91    pub fn new(schema: impl Into<String>, name: impl Into<String>) -> Self {
92        Self {
93            schema: schema.into(),
94            name: name.into(),
95            doc: None,
96            fields: BTreeMap::new(),
97            fallback: None,
98        }
99    }
100
101    pub fn doc(mut self, doc: impl Into<String>) -> Self {
102        self.doc = Some(doc.into());
103        self
104    }
105
106    pub fn field(mut self, field: FieldIr) -> Self {
107        self.fields.insert(field.id(), field);
108        self
109    }
110
111    pub fn fallback(mut self, fallback: StructFallbackIr) -> Self {
112        self.fallback = Some(fallback);
113        self
114    }
115
116    pub fn finish(self) -> StructIr {
117        StructIr {
118            schema: self.schema,
119            name: self.name,
120            doc: self.doc,
121            fields: self.fields,
122            fallback: self.fallback,
123        }
124    }
125}