aldrin_core/
serialize_key.rs

1use crate::buf_ext::BufMutExt;
2use crate::error::SerializeError;
3use crate::value::ValueKind;
4use bytes::BufMut;
5use uuid::Uuid;
6
7pub trait Sealed {
8    fn serialize_key<B: BufMut>(&self, buf: &mut B) -> Result<(), SerializeError>;
9    fn serialize_map_value_kind<B: BufMut>(buf: &mut B);
10    fn serialize_set_value_kind<B: BufMut>(buf: &mut B);
11}
12
13pub trait SerializeKey: Sealed {}
14
15impl<T: Sealed + ?Sized> Sealed for &T {
16    fn serialize_key<B: BufMut>(&self, buf: &mut B) -> Result<(), SerializeError> {
17        (**self).serialize_key(buf)
18    }
19
20    fn serialize_map_value_kind<B: BufMut>(buf: &mut B) {
21        T::serialize_map_value_kind(buf)
22    }
23
24    fn serialize_set_value_kind<B: BufMut>(buf: &mut B) {
25        T::serialize_set_value_kind(buf)
26    }
27}
28
29impl<T: SerializeKey + ?Sized> SerializeKey for &T {}
30
31impl<T: Sealed + ?Sized> Sealed for &mut T {
32    fn serialize_key<B: BufMut>(&self, buf: &mut B) -> Result<(), SerializeError> {
33        (**self).serialize_key(buf)
34    }
35
36    fn serialize_map_value_kind<B: BufMut>(buf: &mut B) {
37        T::serialize_map_value_kind(buf)
38    }
39
40    fn serialize_set_value_kind<B: BufMut>(buf: &mut B) {
41        T::serialize_set_value_kind(buf)
42    }
43}
44
45impl<T: SerializeKey + ?Sized> SerializeKey for &mut T {}
46
47impl<T: Sealed + ?Sized> Sealed for Box<T> {
48    fn serialize_key<B: BufMut>(&self, buf: &mut B) -> Result<(), SerializeError> {
49        (**self).serialize_key(buf)
50    }
51
52    fn serialize_map_value_kind<B: BufMut>(buf: &mut B) {
53        T::serialize_map_value_kind(buf)
54    }
55
56    fn serialize_set_value_kind<B: BufMut>(buf: &mut B) {
57        T::serialize_set_value_kind(buf)
58    }
59}
60
61impl<T: SerializeKey + ?Sized> SerializeKey for Box<T> {}
62
63impl Sealed for u8 {
64    fn serialize_key<B: BufMut>(&self, buf: &mut B) -> Result<(), SerializeError> {
65        buf.put_u8(*self);
66        Ok(())
67    }
68
69    fn serialize_map_value_kind<B: BufMut>(buf: &mut B) {
70        buf.put_discriminant_u8(ValueKind::U8Map);
71    }
72
73    fn serialize_set_value_kind<B: BufMut>(buf: &mut B) {
74        buf.put_discriminant_u8(ValueKind::U8Set);
75    }
76}
77
78impl SerializeKey for u8 {}
79
80impl Sealed for i8 {
81    fn serialize_key<B: BufMut>(&self, buf: &mut B) -> Result<(), SerializeError> {
82        buf.put_i8(*self);
83        Ok(())
84    }
85
86    fn serialize_map_value_kind<B: BufMut>(buf: &mut B) {
87        buf.put_discriminant_u8(ValueKind::I8Map);
88    }
89
90    fn serialize_set_value_kind<B: BufMut>(buf: &mut B) {
91        buf.put_discriminant_u8(ValueKind::I8Set);
92    }
93}
94
95impl SerializeKey for i8 {}
96
97impl Sealed for u16 {
98    fn serialize_key<B: BufMut>(&self, buf: &mut B) -> Result<(), SerializeError> {
99        buf.put_varint_u16_le(*self);
100        Ok(())
101    }
102
103    fn serialize_map_value_kind<B: BufMut>(buf: &mut B) {
104        buf.put_discriminant_u8(ValueKind::U16Map);
105    }
106
107    fn serialize_set_value_kind<B: BufMut>(buf: &mut B) {
108        buf.put_discriminant_u8(ValueKind::U16Set);
109    }
110}
111
112impl SerializeKey for u16 {}
113
114impl Sealed for i16 {
115    fn serialize_key<B: BufMut>(&self, buf: &mut B) -> Result<(), SerializeError> {
116        buf.put_varint_i16_le(*self);
117        Ok(())
118    }
119
120    fn serialize_map_value_kind<B: BufMut>(buf: &mut B) {
121        buf.put_discriminant_u8(ValueKind::I16Map);
122    }
123
124    fn serialize_set_value_kind<B: BufMut>(buf: &mut B) {
125        buf.put_discriminant_u8(ValueKind::I16Set);
126    }
127}
128
129impl SerializeKey for i16 {}
130
131impl Sealed for u32 {
132    fn serialize_key<B: BufMut>(&self, buf: &mut B) -> Result<(), SerializeError> {
133        buf.put_varint_u32_le(*self);
134        Ok(())
135    }
136
137    fn serialize_map_value_kind<B: BufMut>(buf: &mut B) {
138        buf.put_discriminant_u8(ValueKind::U32Map);
139    }
140
141    fn serialize_set_value_kind<B: BufMut>(buf: &mut B) {
142        buf.put_discriminant_u8(ValueKind::U32Set);
143    }
144}
145
146impl SerializeKey for u32 {}
147
148impl Sealed for i32 {
149    fn serialize_key<B: BufMut>(&self, buf: &mut B) -> Result<(), SerializeError> {
150        buf.put_varint_i32_le(*self);
151        Ok(())
152    }
153
154    fn serialize_map_value_kind<B: BufMut>(buf: &mut B) {
155        buf.put_discriminant_u8(ValueKind::I32Map);
156    }
157
158    fn serialize_set_value_kind<B: BufMut>(buf: &mut B) {
159        buf.put_discriminant_u8(ValueKind::I32Set);
160    }
161}
162
163impl SerializeKey for i32 {}
164
165impl Sealed for u64 {
166    fn serialize_key<B: BufMut>(&self, buf: &mut B) -> Result<(), SerializeError> {
167        buf.put_varint_u64_le(*self);
168        Ok(())
169    }
170
171    fn serialize_map_value_kind<B: BufMut>(buf: &mut B) {
172        buf.put_discriminant_u8(ValueKind::U64Map);
173    }
174
175    fn serialize_set_value_kind<B: BufMut>(buf: &mut B) {
176        buf.put_discriminant_u8(ValueKind::U64Set);
177    }
178}
179
180impl SerializeKey for u64 {}
181
182impl Sealed for i64 {
183    fn serialize_key<B: BufMut>(&self, buf: &mut B) -> Result<(), SerializeError> {
184        buf.put_varint_i64_le(*self);
185        Ok(())
186    }
187
188    fn serialize_map_value_kind<B: BufMut>(buf: &mut B) {
189        buf.put_discriminant_u8(ValueKind::I64Map);
190    }
191
192    fn serialize_set_value_kind<B: BufMut>(buf: &mut B) {
193        buf.put_discriminant_u8(ValueKind::I64Set);
194    }
195}
196
197impl SerializeKey for i64 {}
198
199impl Sealed for str {
200    fn serialize_key<B: BufMut>(&self, buf: &mut B) -> Result<(), SerializeError> {
201        if self.len() <= u32::MAX as usize {
202            buf.put_varint_u32_le(self.len() as u32);
203            buf.put_slice(self.as_bytes());
204            Ok(())
205        } else {
206            Err(SerializeError::Overflow)
207        }
208    }
209
210    fn serialize_map_value_kind<B: BufMut>(buf: &mut B) {
211        buf.put_discriminant_u8(ValueKind::StringMap);
212    }
213
214    fn serialize_set_value_kind<B: BufMut>(buf: &mut B) {
215        buf.put_discriminant_u8(ValueKind::StringSet);
216    }
217}
218
219impl SerializeKey for str {}
220
221impl Sealed for String {
222    fn serialize_key<B: BufMut>(&self, buf: &mut B) -> Result<(), SerializeError> {
223        self.as_str().serialize_key(buf)
224    }
225
226    fn serialize_map_value_kind<B: BufMut>(buf: &mut B) {
227        str::serialize_map_value_kind(buf);
228    }
229
230    fn serialize_set_value_kind<B: BufMut>(buf: &mut B) {
231        str::serialize_set_value_kind(buf);
232    }
233}
234
235impl SerializeKey for String {}
236
237impl Sealed for Uuid {
238    fn serialize_key<B: BufMut>(&self, buf: &mut B) -> Result<(), SerializeError> {
239        buf.put_slice(self.as_bytes());
240        Ok(())
241    }
242
243    fn serialize_map_value_kind<B: BufMut>(buf: &mut B) {
244        buf.put_discriminant_u8(ValueKind::UuidMap);
245    }
246
247    fn serialize_set_value_kind<B: BufMut>(buf: &mut B) {
248        buf.put_discriminant_u8(ValueKind::UuidSet);
249    }
250}
251
252impl SerializeKey for Uuid {}