aldrin_core/impls/
primitive.rs

1#[cfg(feature = "introspection")]
2use crate::introspection::{ir, Introspectable, LexicalId, References};
3use crate::tags::{self, PrimaryTag};
4use crate::{Deserialize, DeserializeError, Deserializer, Serialize, SerializeError, Serializer};
5
6macro_rules! impl_primitive {
7    {
8        :tag $tag:ty ,
9        :primary $( $primary:ty , )+
10        :introspection $layout:ident, $lexid:ident,
11        :ser_fn $ser_fn:ident ,
12        :ser_for $( $ser_for:ty , )+
13        :de_fn $de_fn:ident ,
14        :de_for $( $de_for:ty , )+
15    } => {
16        $(
17            impl PrimaryTag for $primary {
18                type Tag = $tag;
19            }
20
21            #[cfg(feature = "introspection")]
22            impl Introspectable for $primary {
23                fn layout() -> ir::LayoutIr {
24                    ir::BuiltInTypeIr::$layout.into()
25                }
26
27                fn lexical_id() -> LexicalId {
28                    LexicalId::$lexid
29                }
30
31                fn add_references(_references: &mut References) {}
32            }
33        )+
34
35        $(
36            impl Serialize<$tag> for $ser_for {
37                fn serialize(self, serializer: Serializer) -> Result<(), SerializeError> {
38                    let val = self.try_into().map_err(|_| SerializeError::UnexpectedValue)?;
39                    serializer.$ser_fn(val)
40                }
41            }
42
43            impl Serialize<$tag> for & $ser_for {
44                fn serialize(self, serializer: Serializer) -> Result<(), SerializeError> {
45                    serializer.serialize::<$tag>(*self)
46                }
47            }
48        )+
49
50        $(
51            impl Deserialize<$tag> for $de_for {
52                fn deserialize(deserializer: Deserializer) -> Result<Self, DeserializeError> {
53                    deserializer.$de_fn()?.try_into().map_err(|_| DeserializeError::UnexpectedValue)
54                }
55            }
56        )+
57    };
58}
59
60impl_primitive! {
61    :tag tags::Bool,
62    :primary bool,
63    :introspection Bool, BOOL,
64    :ser_fn serialize_bool,
65    :ser_for bool,
66    :de_fn deserialize_bool,
67    :de_for bool,
68}
69
70impl_primitive! {
71    :tag tags::U8,
72    :primary u8,
73    :introspection U8, U8,
74    :ser_fn serialize_u8,
75    :ser_for u8, i8, u16, i16, u32, i32, u64, i64, u128, i128, usize, isize,
76    :de_fn deserialize_u8,
77    :de_for u8, i8, u16, i16, u32, i32, u64, i64, u128, i128, usize, isize, f32, f64,
78}
79
80impl_primitive! {
81    :tag tags::I8,
82    :primary i8,
83    :introspection I8, I8,
84    :ser_fn serialize_i8,
85    :ser_for u8, i8, u16, i16, u32, i32, u64, i64, u128, i128, usize, isize,
86    :de_fn deserialize_i8,
87    :de_for u8, i8, u16, i16, u32, i32, u64, i64, u128, i128, usize, isize, f32, f64,
88}
89
90impl_primitive! {
91    :tag tags::U16,
92    :primary u16,
93    :introspection U16, U16,
94    :ser_fn serialize_u16,
95    :ser_for u8, i8, u16, i16, u32, i32, u64, i64, u128, i128, usize, isize,
96    :de_fn deserialize_u16,
97    :de_for u8, i8, u16, i16, u32, i32, u64, i64, u128, i128, usize, isize, f32, f64,
98}
99
100impl_primitive! {
101    :tag tags::I16,
102    :primary i16,
103    :introspection I16, I16,
104    :ser_fn serialize_i16,
105    :ser_for u8, i8, u16, i16, u32, i32, u64, i64, u128, i128, usize, isize,
106    :de_fn deserialize_i16,
107    :de_for u8, i8, u16, i16, u32, i32, u64, i64, u128, i128, usize, isize, f32, f64,
108}
109
110impl_primitive! {
111    :tag tags::U32,
112    :primary u32,
113    :introspection U32, U32,
114    :ser_fn serialize_u32,
115    :ser_for u8, i8, u16, i16, u32, i32, u64, i64, u128, i128, usize, isize,
116    :de_fn deserialize_u32,
117    :de_for u8, i8, u16, i16, u32, i32, u64, i64, u128, i128, usize, isize, f64,
118}
119
120impl_primitive! {
121    :tag tags::I32,
122    :primary i32,
123    :introspection I32, I32,
124    :ser_fn serialize_i32,
125    :ser_for u8, i8, u16, i16, u32, i32, u64, i64, u128, i128, usize, isize,
126    :de_fn deserialize_i32,
127    :de_for u8, i8, u16, i16, u32, i32, u64, i64, u128, i128, usize, isize, f64,
128}
129
130impl_primitive! {
131    :tag tags::U64,
132    :primary u64, usize,
133    :introspection U64, U64,
134    :ser_fn serialize_u64,
135    :ser_for u8, i8, u16, i16, u32, i32, u64, i64, u128, i128, usize, isize,
136    :de_fn deserialize_u64,
137    :de_for u8, i8, u16, i16, u32, i32, u64, i64, u128, i128, usize, isize,
138}
139
140impl_primitive! {
141    :tag tags::I64,
142    :primary i64, isize,
143    :introspection I64, I64,
144    :ser_fn serialize_i64,
145    :ser_for u8, i8, u16, i16, u32, i32, u64, i64, u128, i128, usize, isize,
146    :de_fn deserialize_i64,
147    :de_for u8, i8, u16, i16, u32, i32, u64, i64, u128, i128, usize, isize,
148}
149
150impl_primitive! {
151    :tag tags::F32,
152    :primary f32,
153    :introspection F32, F32,
154    :ser_fn serialize_f32,
155    :ser_for u8, i8, u16, i16, f32,
156    :de_fn deserialize_f32,
157    :de_for f32, f64,
158}
159
160impl_primitive! {
161    :tag tags::F64,
162    :primary f64,
163    :introspection F64, F64,
164    :ser_fn serialize_f64,
165    :ser_for u8, i8, u16, i16, u32, i32, f32, f64,
166    :de_fn deserialize_f64,
167    :de_for f64,
168}