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}