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}