aldrin_core/introspection/ir/
field.rs1use 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 FieldIr {
8 pub(crate) id: u32,
9 pub(crate) name: String,
10 pub(crate) doc: Option<String>,
11 pub(crate) is_required: bool,
12 pub(crate) field_type: LexicalId,
13}
14
15impl FieldIr {
16 pub fn builder(
17 id: u32,
18 name: impl Into<String>,
19 is_required: bool,
20 field_type: LexicalId,
21 ) -> FieldIrBuilder {
22 FieldIrBuilder::new(id, name, is_required, field_type)
23 }
24
25 pub fn id(&self) -> u32 {
26 self.id
27 }
28
29 pub fn name(&self) -> &str {
30 &self.name
31 }
32
33 pub fn doc(&self) -> Option<&str> {
34 self.doc.as_deref()
35 }
36
37 pub fn is_required(&self) -> bool {
38 self.is_required
39 }
40
41 pub fn field_type(&self) -> LexicalId {
42 self.field_type
43 }
44}
45
46#[derive(IntoPrimitive, TryFromPrimitive)]
47#[repr(u32)]
48enum FieldField {
49 Id = 0,
50 Name = 1,
51 IsRequired = 2,
52 FieldType = 3,
53}
54
55impl Tag for FieldIr {}
56
57impl PrimaryTag for FieldIr {
58 type Tag = Self;
59}
60
61impl Serialize<FieldIr> for &FieldIr {
62 fn serialize(self, serializer: Serializer) -> Result<(), SerializeError> {
63 let mut serializer = serializer.serialize_struct2()?;
64
65 serializer.serialize::<tags::U32>(FieldField::Id, &self.id)?;
66 serializer.serialize::<tags::String>(FieldField::Name, &self.name)?;
67 serializer.serialize::<tags::Bool>(FieldField::IsRequired, &self.is_required)?;
68 serializer.serialize::<LexicalId>(FieldField::FieldType, &self.field_type)?;
69
70 serializer.finish()
71 }
72}
73
74#[derive(Debug, Clone)]
75pub struct FieldIrBuilder {
76 id: u32,
77 name: String,
78 doc: Option<String>,
79 is_required: bool,
80 field_type: LexicalId,
81}
82
83impl FieldIrBuilder {
84 pub fn new(id: u32, name: impl Into<String>, is_required: bool, field_type: LexicalId) -> Self {
85 Self {
86 id,
87 name: name.into(),
88 doc: None,
89 is_required,
90 field_type,
91 }
92 }
93
94 pub fn doc(mut self, doc: impl Into<String>) -> Self {
95 self.doc = Some(doc.into());
96 self
97 }
98
99 pub fn finish(self) -> FieldIr {
100 FieldIr {
101 id: self.id,
102 name: self.name,
103 doc: self.doc,
104 is_required: self.is_required,
105 field_type: self.field_type,
106 }
107 }
108}