1use super::{write::Writer, Encode, Encoder};
2use crate::{
3 config::{Endianness, IntEncoding, InternalEndianConfig, InternalIntEncodingConfig},
4 error::EncodeError,
5};
6use core::cmp::Reverse;
7use core::{
8 cell::{Cell, RefCell},
9 marker::PhantomData,
10 num::{
11 NonZeroI128, NonZeroI16, NonZeroI32, NonZeroI64, NonZeroI8, NonZeroIsize, NonZeroU128,
12 NonZeroU16, NonZeroU32, NonZeroU64, NonZeroU8, NonZeroUsize, Wrapping,
13 },
14 ops::{Bound, Range, RangeInclusive},
15 time::Duration,
16};
17
18impl Encode for () {
19 fn encode<E: Encoder>(&self, _: &mut E) -> Result<(), EncodeError> {
20 Ok(())
21 }
22}
23
24impl<T> Encode for PhantomData<T> {
25 fn encode<E: Encoder>(&self, _: &mut E) -> Result<(), EncodeError> {
26 Ok(())
27 }
28}
29
30impl Encode for bool {
31 fn encode<E: Encoder>(&self, encoder: &mut E) -> Result<(), EncodeError> {
32 u8::from(*self).encode(encoder)
33 }
34}
35
36impl Encode for u8 {
37 fn encode<E: Encoder>(&self, encoder: &mut E) -> Result<(), EncodeError> {
38 encoder.writer().write(&[*self])
39 }
40}
41
42impl Encode for NonZeroU8 {
43 fn encode<E: Encoder>(&self, encoder: &mut E) -> Result<(), EncodeError> {
44 self.get().encode(encoder)
45 }
46}
47
48impl Encode for u16 {
49 fn encode<E: Encoder>(&self, encoder: &mut E) -> Result<(), EncodeError> {
50 match E::C::INT_ENCODING {
51 IntEncoding::Variable => {
52 crate::varint::varint_encode_u16(encoder.writer(), E::C::ENDIAN, *self)
53 }
54 IntEncoding::Fixed => match E::C::ENDIAN {
55 Endianness::Big => encoder.writer().write(&self.to_be_bytes()),
56 Endianness::Little => encoder.writer().write(&self.to_le_bytes()),
57 },
58 }
59 }
60}
61
62impl Encode for NonZeroU16 {
63 fn encode<E: Encoder>(&self, encoder: &mut E) -> Result<(), EncodeError> {
64 self.get().encode(encoder)
65 }
66}
67
68impl Encode for u32 {
69 fn encode<E: Encoder>(&self, encoder: &mut E) -> Result<(), EncodeError> {
70 match E::C::INT_ENCODING {
71 IntEncoding::Variable => {
72 crate::varint::varint_encode_u32(encoder.writer(), E::C::ENDIAN, *self)
73 }
74 IntEncoding::Fixed => match E::C::ENDIAN {
75 Endianness::Big => encoder.writer().write(&self.to_be_bytes()),
76 Endianness::Little => encoder.writer().write(&self.to_le_bytes()),
77 },
78 }
79 }
80}
81
82impl Encode for NonZeroU32 {
83 fn encode<E: Encoder>(&self, encoder: &mut E) -> Result<(), EncodeError> {
84 self.get().encode(encoder)
85 }
86}
87
88impl Encode for u64 {
89 fn encode<E: Encoder>(&self, encoder: &mut E) -> Result<(), EncodeError> {
90 match E::C::INT_ENCODING {
91 IntEncoding::Variable => {
92 crate::varint::varint_encode_u64(encoder.writer(), E::C::ENDIAN, *self)
93 }
94 IntEncoding::Fixed => match E::C::ENDIAN {
95 Endianness::Big => encoder.writer().write(&self.to_be_bytes()),
96 Endianness::Little => encoder.writer().write(&self.to_le_bytes()),
97 },
98 }
99 }
100}
101
102impl Encode for NonZeroU64 {
103 fn encode<E: Encoder>(&self, encoder: &mut E) -> Result<(), EncodeError> {
104 self.get().encode(encoder)
105 }
106}
107
108impl Encode for u128 {
109 fn encode<E: Encoder>(&self, encoder: &mut E) -> Result<(), EncodeError> {
110 match E::C::INT_ENCODING {
111 IntEncoding::Variable => {
112 crate::varint::varint_encode_u128(encoder.writer(), E::C::ENDIAN, *self)
113 }
114 IntEncoding::Fixed => match E::C::ENDIAN {
115 Endianness::Big => encoder.writer().write(&self.to_be_bytes()),
116 Endianness::Little => encoder.writer().write(&self.to_le_bytes()),
117 },
118 }
119 }
120}
121
122impl Encode for NonZeroU128 {
123 fn encode<E: Encoder>(&self, encoder: &mut E) -> Result<(), EncodeError> {
124 self.get().encode(encoder)
125 }
126}
127
128impl Encode for usize {
129 fn encode<E: Encoder>(&self, encoder: &mut E) -> Result<(), EncodeError> {
130 match E::C::INT_ENCODING {
131 IntEncoding::Variable => {
132 crate::varint::varint_encode_usize(encoder.writer(), E::C::ENDIAN, *self)
133 }
134 IntEncoding::Fixed => match E::C::ENDIAN {
135 Endianness::Big => encoder.writer().write(&(*self as u64).to_be_bytes()),
136 Endianness::Little => encoder.writer().write(&(*self as u64).to_le_bytes()),
137 },
138 }
139 }
140}
141
142impl Encode for NonZeroUsize {
143 fn encode<E: Encoder>(&self, encoder: &mut E) -> Result<(), EncodeError> {
144 self.get().encode(encoder)
145 }
146}
147
148impl Encode for i8 {
149 fn encode<E: Encoder>(&self, encoder: &mut E) -> Result<(), EncodeError> {
150 encoder.writer().write(&[*self as u8])
151 }
152}
153
154impl Encode for NonZeroI8 {
155 fn encode<E: Encoder>(&self, encoder: &mut E) -> Result<(), EncodeError> {
156 self.get().encode(encoder)
157 }
158}
159
160impl Encode for i16 {
161 fn encode<E: Encoder>(&self, encoder: &mut E) -> Result<(), EncodeError> {
162 match E::C::INT_ENCODING {
163 IntEncoding::Variable => {
164 crate::varint::varint_encode_i16(encoder.writer(), E::C::ENDIAN, *self)
165 }
166 IntEncoding::Fixed => match E::C::ENDIAN {
167 Endianness::Big => encoder.writer().write(&self.to_be_bytes()),
168 Endianness::Little => encoder.writer().write(&self.to_le_bytes()),
169 },
170 }
171 }
172}
173
174impl Encode for NonZeroI16 {
175 fn encode<E: Encoder>(&self, encoder: &mut E) -> Result<(), EncodeError> {
176 self.get().encode(encoder)
177 }
178}
179
180impl Encode for i32 {
181 fn encode<E: Encoder>(&self, encoder: &mut E) -> Result<(), EncodeError> {
182 match E::C::INT_ENCODING {
183 IntEncoding::Variable => {
184 crate::varint::varint_encode_i32(encoder.writer(), E::C::ENDIAN, *self)
185 }
186 IntEncoding::Fixed => match E::C::ENDIAN {
187 Endianness::Big => encoder.writer().write(&self.to_be_bytes()),
188 Endianness::Little => encoder.writer().write(&self.to_le_bytes()),
189 },
190 }
191 }
192}
193
194impl Encode for NonZeroI32 {
195 fn encode<E: Encoder>(&self, encoder: &mut E) -> Result<(), EncodeError> {
196 self.get().encode(encoder)
197 }
198}
199
200impl Encode for i64 {
201 fn encode<E: Encoder>(&self, encoder: &mut E) -> Result<(), EncodeError> {
202 match E::C::INT_ENCODING {
203 IntEncoding::Variable => {
204 crate::varint::varint_encode_i64(encoder.writer(), E::C::ENDIAN, *self)
205 }
206 IntEncoding::Fixed => match E::C::ENDIAN {
207 Endianness::Big => encoder.writer().write(&self.to_be_bytes()),
208 Endianness::Little => encoder.writer().write(&self.to_le_bytes()),
209 },
210 }
211 }
212}
213
214impl Encode for NonZeroI64 {
215 fn encode<E: Encoder>(&self, encoder: &mut E) -> Result<(), EncodeError> {
216 self.get().encode(encoder)
217 }
218}
219
220impl Encode for i128 {
221 fn encode<E: Encoder>(&self, encoder: &mut E) -> Result<(), EncodeError> {
222 match E::C::INT_ENCODING {
223 IntEncoding::Variable => {
224 crate::varint::varint_encode_i128(encoder.writer(), E::C::ENDIAN, *self)
225 }
226 IntEncoding::Fixed => match E::C::ENDIAN {
227 Endianness::Big => encoder.writer().write(&self.to_be_bytes()),
228 Endianness::Little => encoder.writer().write(&self.to_le_bytes()),
229 },
230 }
231 }
232}
233
234impl Encode for NonZeroI128 {
235 fn encode<E: Encoder>(&self, encoder: &mut E) -> Result<(), EncodeError> {
236 self.get().encode(encoder)
237 }
238}
239
240impl Encode for isize {
241 fn encode<E: Encoder>(&self, encoder: &mut E) -> Result<(), EncodeError> {
242 match E::C::INT_ENCODING {
243 IntEncoding::Variable => {
244 crate::varint::varint_encode_isize(encoder.writer(), E::C::ENDIAN, *self)
245 }
246 IntEncoding::Fixed => match E::C::ENDIAN {
247 Endianness::Big => encoder.writer().write(&(*self as i64).to_be_bytes()),
248 Endianness::Little => encoder.writer().write(&(*self as i64).to_le_bytes()),
249 },
250 }
251 }
252}
253
254impl Encode for NonZeroIsize {
255 fn encode<E: Encoder>(&self, encoder: &mut E) -> Result<(), EncodeError> {
256 self.get().encode(encoder)
257 }
258}
259
260impl Encode for f32 {
261 fn encode<E: Encoder>(&self, encoder: &mut E) -> Result<(), EncodeError> {
262 match E::C::ENDIAN {
263 Endianness::Big => encoder.writer().write(&self.to_be_bytes()),
264 Endianness::Little => encoder.writer().write(&self.to_le_bytes()),
265 }
266 }
267}
268
269impl Encode for f64 {
270 fn encode<E: Encoder>(&self, encoder: &mut E) -> Result<(), EncodeError> {
271 match E::C::ENDIAN {
272 Endianness::Big => encoder.writer().write(&self.to_be_bytes()),
273 Endianness::Little => encoder.writer().write(&self.to_le_bytes()),
274 }
275 }
276}
277
278impl<T: Encode> Encode for Wrapping<T> {
279 fn encode<E: Encoder>(&self, encoder: &mut E) -> Result<(), EncodeError> {
280 self.0.encode(encoder)
281 }
282}
283
284impl<T: Encode> Encode for Reverse<T> {
285 fn encode<E: Encoder>(&self, encoder: &mut E) -> Result<(), EncodeError> {
286 self.0.encode(encoder)
287 }
288}
289
290impl Encode for char {
291 fn encode<E: Encoder>(&self, encoder: &mut E) -> Result<(), EncodeError> {
292 encode_utf8(encoder.writer(), *self)
293 }
294}
295
296impl<T> Encode for [T]
297where
298 T: Encode,
299{
300 fn encode<E: Encoder>(&self, encoder: &mut E) -> Result<(), EncodeError> {
301 super::encode_slice_len(encoder, self.len())?;
302
303 if unty::type_equal::<T, u8>() {
304 let t: &[u8] = unsafe { core::mem::transmute(self) };
306 encoder.writer().write(t)?;
307 return Ok(());
308 }
309
310 for item in self {
311 item.encode(encoder)?;
312 }
313 Ok(())
314 }
315}
316
317const TAG_CONT: u8 = 0b1000_0000;
318const TAG_TWO_B: u8 = 0b1100_0000;
319const TAG_THREE_B: u8 = 0b1110_0000;
320const TAG_FOUR_B: u8 = 0b1111_0000;
321const MAX_ONE_B: u32 = 0x80;
322const MAX_TWO_B: u32 = 0x800;
323const MAX_THREE_B: u32 = 0x10000;
324
325fn encode_utf8(writer: &mut impl Writer, c: char) -> Result<(), EncodeError> {
326 let code = c as u32;
327
328 if code < MAX_ONE_B {
329 writer.write(&[c as u8])
330 } else if code < MAX_TWO_B {
331 let mut buf = [0u8; 2];
332 buf[0] = ((code >> 6) & 0x1F) as u8 | TAG_TWO_B;
333 buf[1] = (code & 0x3F) as u8 | TAG_CONT;
334 writer.write(&buf)
335 } else if code < MAX_THREE_B {
336 let mut buf = [0u8; 3];
337 buf[0] = ((code >> 12) & 0x0F) as u8 | TAG_THREE_B;
338 buf[1] = ((code >> 6) & 0x3F) as u8 | TAG_CONT;
339 buf[2] = (code & 0x3F) as u8 | TAG_CONT;
340 writer.write(&buf)
341 } else {
342 let mut buf = [0u8; 4];
343 buf[0] = ((code >> 18) & 0x07) as u8 | TAG_FOUR_B;
344 buf[1] = ((code >> 12) & 0x3F) as u8 | TAG_CONT;
345 buf[2] = ((code >> 6) & 0x3F) as u8 | TAG_CONT;
346 buf[3] = (code & 0x3F) as u8 | TAG_CONT;
347 writer.write(&buf)
348 }
349}
350
351impl Encode for str {
352 fn encode<E: Encoder>(&self, encoder: &mut E) -> Result<(), EncodeError> {
353 self.as_bytes().encode(encoder)
354 }
355}
356
357impl<T, const N: usize> Encode for [T; N]
358where
359 T: Encode,
360{
361 fn encode<E: Encoder>(&self, encoder: &mut E) -> Result<(), EncodeError> {
362 if unty::type_equal::<T, u8>() {
363 let array_slice: &[u8] =
365 unsafe { core::slice::from_raw_parts(self.as_ptr().cast(), N) };
366 encoder.writer().write(array_slice)
367 } else {
368 for item in self.iter() {
369 item.encode(encoder)?;
370 }
371 Ok(())
372 }
373 }
374}
375
376impl<T> Encode for Option<T>
377where
378 T: Encode,
379{
380 fn encode<E: Encoder>(&self, encoder: &mut E) -> Result<(), EncodeError> {
381 super::encode_option_variant(encoder, self)?;
382 if let Some(val) = self {
383 val.encode(encoder)?;
384 }
385 Ok(())
386 }
387}
388
389impl<T, U> Encode for Result<T, U>
390where
391 T: Encode,
392 U: Encode,
393{
394 fn encode<E: Encoder>(&self, encoder: &mut E) -> Result<(), EncodeError> {
395 match self {
396 Ok(val) => {
397 0u32.encode(encoder)?;
398 val.encode(encoder)
399 }
400 Err(err) => {
401 1u32.encode(encoder)?;
402 err.encode(encoder)
403 }
404 }
405 }
406}
407
408impl<T> Encode for Cell<T>
409where
410 T: Encode + Copy,
411{
412 fn encode<E: Encoder>(&self, encoder: &mut E) -> Result<(), EncodeError> {
413 T::encode(&self.get(), encoder)
414 }
415}
416
417impl<T> Encode for RefCell<T>
418where
419 T: Encode + ?Sized,
420{
421 fn encode<E: Encoder>(&self, encoder: &mut E) -> Result<(), EncodeError> {
422 let borrow_guard = self
423 .try_borrow()
424 .map_err(|e| EncodeError::RefCellAlreadyBorrowed {
425 inner: e,
426 type_name: core::any::type_name::<RefCell<T>>(),
427 })?;
428 T::encode(&borrow_guard, encoder)
429 }
430}
431
432impl Encode for Duration {
433 fn encode<E: Encoder>(&self, encoder: &mut E) -> Result<(), EncodeError> {
434 self.as_secs().encode(encoder)?;
435 self.subsec_nanos().encode(encoder)?;
436 Ok(())
437 }
438}
439
440impl<T> Encode for Range<T>
441where
442 T: Encode,
443{
444 fn encode<E: Encoder>(&self, encoder: &mut E) -> Result<(), EncodeError> {
445 self.start.encode(encoder)?;
446 self.end.encode(encoder)?;
447 Ok(())
448 }
449}
450
451impl<T> Encode for RangeInclusive<T>
452where
453 T: Encode,
454{
455 fn encode<E: Encoder>(&self, encoder: &mut E) -> Result<(), EncodeError> {
456 self.start().encode(encoder)?;
457 self.end().encode(encoder)?;
458 Ok(())
459 }
460}
461
462impl<T> Encode for Bound<T>
463where
464 T: Encode,
465{
466 fn encode<E: Encoder>(&self, encoder: &mut E) -> Result<(), EncodeError> {
467 match self {
468 Self::Unbounded => {
469 0u32.encode(encoder)?;
470 }
471 Self::Included(val) => {
472 1u32.encode(encoder)?;
473 val.encode(encoder)?;
474 }
475 Self::Excluded(val) => {
476 2u32.encode(encoder)?;
477 val.encode(encoder)?;
478 }
479 }
480 Ok(())
481 }
482}
483
484impl<T> Encode for &T
485where
486 T: Encode + ?Sized,
487{
488 fn encode<E: Encoder>(&self, encoder: &mut E) -> Result<(), EncodeError> {
489 T::encode(self, encoder)
490 }
491}