aldrin_core/introspection/
field.rs1use super::LexicalId;
2use crate::error::{DeserializeError, SerializeError};
3use crate::value_deserializer::{Deserialize, Deserializer};
4use crate::value_serializer::{Serialize, Serializer};
5use num_enum::{IntoPrimitive, TryFromPrimitive};
6
7#[derive(Debug, Clone, PartialEq, Eq, PartialOrd, Ord, Hash)]
8pub struct Field {
9 id: u32,
10 name: String,
11 is_required: bool,
12 field_type: LexicalId,
13}
14
15impl Field {
16 pub(super) fn new(
17 id: u32,
18 name: impl Into<String>,
19 is_required: bool,
20 field_type: LexicalId,
21 ) -> Self {
22 Self {
23 id,
24 name: name.into(),
25 is_required,
26 field_type,
27 }
28 }
29
30 pub fn id(&self) -> u32 {
31 self.id
32 }
33
34 pub fn name(&self) -> &str {
35 &self.name
36 }
37
38 pub fn is_required(&self) -> bool {
39 self.is_required
40 }
41
42 pub fn field_type(&self) -> LexicalId {
43 self.field_type
44 }
45}
46
47#[derive(IntoPrimitive, TryFromPrimitive)]
48#[repr(u32)]
49enum FieldField {
50 Id = 0,
51 Name = 1,
52 IsRequired = 2,
53 FieldType = 3,
54}
55
56impl Serialize for Field {
57 fn serialize(&self, serializer: Serializer) -> Result<(), SerializeError> {
58 let mut serializer = serializer.serialize_struct(4)?;
59
60 serializer.serialize_field(FieldField::Id, &self.id)?;
61 serializer.serialize_field(FieldField::Name, &self.name)?;
62 serializer.serialize_field(FieldField::IsRequired, &self.is_required)?;
63 serializer.serialize_field(FieldField::FieldType, &self.field_type)?;
64
65 serializer.finish()
66 }
67}
68
69impl Deserialize for Field {
70 fn deserialize(deserializer: Deserializer) -> Result<Self, DeserializeError> {
71 let mut deserializer = deserializer.deserialize_struct()?;
72
73 let mut id = None;
74 let mut name = None;
75 let mut is_required = None;
76 let mut field_type = None;
77
78 while deserializer.has_more_fields() {
79 let deserializer = deserializer.deserialize_field()?;
80
81 match deserializer.try_id()? {
82 FieldField::Id => id = deserializer.deserialize().map(Some)?,
83 FieldField::Name => name = deserializer.deserialize().map(Some)?,
84 FieldField::IsRequired => is_required = deserializer.deserialize().map(Some)?,
85 FieldField::FieldType => field_type = deserializer.deserialize().map(Some)?,
86 }
87 }
88
89 deserializer.finish(Self {
90 id: id.ok_or(DeserializeError::InvalidSerialization)?,
91 name: name.ok_or(DeserializeError::InvalidSerialization)?,
92 is_required: is_required.ok_or(DeserializeError::InvalidSerialization)?,
93 field_type: field_type.ok_or(DeserializeError::InvalidSerialization)?,
94 })
95 }
96}