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