aldrin_core/introspection/ir/
struct_ty.rs1use 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}