Skip to main content

zerompk/
write.rs

1use alloc::vec::Vec;
2
3use crate::{Error, Result, consts::*};
4
5/// A trait for writing MessagePack-encoded data.
6///
7/// ## Examples
8///
9/// ```rust
10/// struct Point {
11///     x: i32,
12///     y: i32,
13/// }
14///
15/// impl ToMessagePack for Point {
16///     fn write<W: Write>(&self, writer: &mut W) -> Result<()> {
17///         writer.write_array_len(2)?;
18///         writer.write_i32(self.x)?;   
19///         writer.write_i32(self.y)?;
20///         Ok(())
21///     }
22/// }
23/// ```
24pub trait Write {
25    /// Writes a nil value.
26    fn write_nil(&mut self) -> Result<()>;
27
28    /// Writes a boolean value.
29    fn write_boolean(&mut self, b: bool) -> Result<()>;
30
31    /// Writes an unsigned 8-bit integer.
32    fn write_u8(&mut self, u: u8) -> Result<()>;
33
34    /// Writes an unsigned 16-bit integer.
35    fn write_u16(&mut self, u: u16) -> Result<()>;
36
37    /// Writes an unsigned 32-bit integer.
38    fn write_u32(&mut self, u: u32) -> Result<()>;
39
40    /// Writes an unsigned 64-bit integer.
41    fn write_u64(&mut self, u: u64) -> Result<()>;
42
43    /// Writes a signed 8-bit integer.
44    fn write_i8(&mut self, i: i8) -> Result<()>;
45
46    /// Writes a signed 16-bit integer.
47    fn write_i16(&mut self, i: i16) -> Result<()>;
48
49    /// Writes a signed 32-bit integer.
50    fn write_i32(&mut self, i: i32) -> Result<()>;
51
52    /// Writes a signed 64-bit integer.
53    fn write_i64(&mut self, i: i64) -> Result<()>;
54
55    /// Writes a 32-bit floating-point number.
56    fn write_f32(&mut self, f: f32) -> Result<()>;
57
58    /// Writes a 64-bit floating-point number.
59    fn write_f64(&mut self, f: f64) -> Result<()>;
60
61    /// Writes a UTF-8 string.
62    fn write_string(&mut self, s: &str) -> Result<()>;
63
64    /// Writes a binary blob.
65    fn write_binary(&mut self, data: &[u8]) -> Result<()>;
66
67    /// Writes a timestamp.
68    fn write_timestamp(&mut self, seconds: i64, nanoseconds: u32) -> Result<()>;
69
70    /// Writes the array header with the length.
71    fn write_array_len(&mut self, len: usize) -> Result<()>;
72
73    /// Writes the map header with the length.
74    fn write_map_len(&mut self, len: usize) -> Result<()>;
75
76    /// Writes an extension type with the given type ID and data.
77    fn write_ext(&mut self, type_id: i8, data: &[u8]) -> Result<()>;
78}
79
80pub struct SliceWriter<'a> {
81    buffer: &'a mut [u8],
82    pos: usize,
83}
84
85impl<'a> SliceWriter<'a> {
86    pub fn new(buffer: &'a mut [u8]) -> Self {
87        SliceWriter { buffer, pos: 0 }
88    }
89
90    #[inline(always)]
91    fn take_array<const N: usize>(&mut self) -> Result<&mut [u8; N]> {
92        if self.pos + N > self.buffer.len() {
93            return Err(Error::BufferTooSmall);
94        }
95        let array: &mut [u8; N] =
96            unsafe { &mut *(self.buffer.as_mut_ptr().add(self.pos) as *mut [u8; N]) };
97        self.pos += N;
98        Ok(array)
99    }
100
101    #[inline(always)]
102    fn take_slice(&mut self, len: usize) -> Result<&mut [u8]> {
103        if self.pos + len > self.buffer.len() {
104            return Err(Error::BufferTooSmall);
105        }
106
107        let slice = unsafe { self.buffer.get_unchecked_mut(self.pos..self.pos + len) };
108        self.pos += len;
109        Ok(slice)
110    }
111
112    #[inline(always)]
113    pub fn position(&self) -> usize {
114        self.pos
115    }
116}
117
118impl<'a> Write for SliceWriter<'a> {
119    #[inline(always)]
120    fn write_nil(&mut self) -> Result<()> {
121        let buf = self.take_array::<1>()?;
122        buf[0] = NIL_MARKER;
123        Ok(())
124    }
125
126    #[inline(always)]
127    fn write_boolean(&mut self, b: bool) -> Result<()> {
128        let buf = self.take_array::<1>()?;
129        buf[0] = if b { TRUE_MARKER } else { FALSE_MARKER };
130        Ok(())
131    }
132
133    #[inline(always)]
134    fn write_u8(&mut self, u: u8) -> Result<()> {
135        if u <= POS_FIXINT_END {
136            let buf = self.take_array::<1>()?;
137            buf[0] = u;
138            Ok(())
139        } else {
140            let buf = self.take_array::<2>()?;
141            *buf = [UINT8_MARKER, u];
142            Ok(())
143        }
144    }
145
146    #[inline(always)]
147    fn write_u16(&mut self, u: u16) -> Result<()> {
148        match u {
149            0..=127 => {
150                let buf = self.take_array::<1>()?;
151                buf[0] = u as u8;
152                Ok(())
153            }
154            128..=255 => {
155                let buf = self.take_array::<2>()?;
156                *buf = [UINT8_MARKER, u as u8];
157                Ok(())
158            }
159            _ => {
160                let buf = self.take_array::<3>()?;
161                let [head, tail @ ..] = buf;
162                *head = UINT16_MARKER;
163                *tail = u.to_be_bytes();
164                Ok(())
165            }
166        }
167    }
168
169    #[inline(always)]
170    fn write_u32(&mut self, u: u32) -> Result<()> {
171        match u {
172            0..=127 => {
173                let buf = self.take_array::<1>()?;
174                buf[0] = u as u8;
175                Ok(())
176            }
177            128..=255 => {
178                let buf = self.take_array::<2>()?;
179                *buf = [UINT8_MARKER, u as u8];
180                Ok(())
181            }
182            256..=65535 => {
183                let buf = self.take_array::<3>()?;
184                let [head, tail @ ..] = buf;
185                *head = UINT16_MARKER;
186                *tail = (u as u16).to_be_bytes();
187                Ok(())
188            }
189            _ => {
190                let buf = self.take_array::<5>()?;
191                let [head, tail @ ..] = buf;
192                *head = UINT32_MARKER;
193                *tail = (u as u32).to_be_bytes();
194                Ok(())
195            }
196        }
197    }
198
199    #[inline(always)]
200    fn write_u64(&mut self, u: u64) -> Result<()> {
201        match u {
202            0..=127 => {
203                let buf = self.take_array::<1>()?;
204                buf[0] = u as u8;
205                Ok(())
206            }
207            128..=255 => {
208                let buf = self.take_array::<2>()?;
209                *buf = [UINT8_MARKER, u as u8];
210                Ok(())
211            }
212            256..=65535 => {
213                let buf = self.take_array::<3>()?;
214                let [head, tail @ ..] = buf;
215                *head = UINT16_MARKER;
216                *tail = (u as u16).to_be_bytes();
217                Ok(())
218            }
219            65536..=4294967295 => {
220                let buf = self.take_array::<5>()?;
221                let [head, tail @ ..] = buf;
222                *head = UINT32_MARKER;
223                *tail = (u as u32).to_be_bytes();
224                Ok(())
225            }
226            _ => {
227                let buf = self.take_array::<9>()?;
228                let [head, tail @ ..] = buf;
229                *head = UINT64_MARKER;
230                *tail = (u as u64).to_be_bytes();
231                Ok(())
232            }
233        }
234    }
235
236    #[inline(always)]
237    fn write_i8(&mut self, i: i8) -> Result<()> {
238        match i {
239            0..=127 => {
240                let buf = self.take_array::<1>()?;
241                buf[0] = i as u8;
242                Ok(())
243            }
244            -32..=-1 => {
245                let buf = self.take_array::<1>()?;
246                buf[0] = 0xe0 | ((i + 32) as u8);
247                Ok(())
248            }
249            _ => {
250                let buf = self.take_array::<2>()?;
251                *buf = [INT8_MARKER, i as u8];
252                Ok(())
253            }
254        }
255    }
256
257    #[inline(always)]
258    fn write_i16(&mut self, i: i16) -> Result<()> {
259        match i {
260            0..=127 => {
261                let buf = self.take_array::<1>()?;
262                buf[0] = i as u8;
263                Ok(())
264            }
265            -32..=-1 => {
266                let buf = self.take_array::<1>()?;
267                buf[0] = 0xe0 | ((i + 32) as u8);
268                Ok(())
269            }
270            -128..=127 => {
271                let buf = self.take_array::<2>()?;
272                *buf = [INT8_MARKER, i as u8];
273                Ok(())
274            }
275            _ => {
276                let buf = self.take_array::<3>()?;
277                let [head, tail @ ..] = buf;
278                *head = INT16_MARKER;
279                *tail = (i as i16).to_be_bytes();
280                Ok(())
281            }
282        }
283    }
284
285    #[inline(always)]
286    fn write_i32(&mut self, i: i32) -> Result<()> {
287        match i {
288            0..=127 => {
289                let buf = self.take_array::<1>()?;
290                buf[0] = i as u8;
291                Ok(())
292            }
293            -32..=-1 => {
294                let buf = self.take_array::<1>()?;
295                buf[0] = 0xe0 | ((i + 32) as u8);
296                Ok(())
297            }
298            -128..=127 => {
299                let buf = self.take_array::<2>()?;
300                *buf = [INT8_MARKER, i as u8];
301                Ok(())
302            }
303            -32768..=32767 => {
304                let buf = self.take_array::<3>()?;
305                let [head, tail @ ..] = buf;
306                *head = INT16_MARKER;
307                *tail = (i as i16).to_be_bytes();
308                Ok(())
309            }
310            _ => {
311                let buf = self.take_array::<5>()?;
312                let [head, tail @ ..] = buf;
313                *head = INT32_MARKER;
314                *tail = (i as i32).to_be_bytes();
315                Ok(())
316            }
317        }
318    }
319
320    #[inline(always)]
321    fn write_i64(&mut self, i: i64) -> Result<()> {
322        match i {
323            0..=127 => {
324                let buf = self.take_array::<1>()?;
325                buf[0] = i as u8;
326                Ok(())
327            }
328            -32..=-1 => {
329                let buf = self.take_array::<1>()?;
330                buf[0] = 0xe0 | ((i + 32) as u8);
331                Ok(())
332            }
333            -128..=127 => {
334                let buf = self.take_array::<2>()?;
335                *buf = [INT8_MARKER, i as u8];
336                Ok(())
337            }
338            -32768..=32767 => {
339                let buf = self.take_array::<3>()?;
340                let [head, tail @ ..] = buf;
341                *head = INT16_MARKER;
342                *tail = (i as i16).to_be_bytes();
343                Ok(())
344            }
345            -2147483648..=2147483647 => {
346                let buf = self.take_array::<5>()?;
347                let [head, tail @ ..] = buf;
348                *head = INT32_MARKER;
349                *tail = (i as i32).to_be_bytes();
350                Ok(())
351            }
352            _ => {
353                let buf = self.take_array::<9>()?;
354                let [head, tail @ ..] = buf;
355                *head = INT64_MARKER;
356                *tail = (i as i64).to_be_bytes();
357                Ok(())
358            }
359        }
360    }
361
362    #[inline(always)]
363    fn write_f32(&mut self, f: f32) -> Result<()> {
364        let buf = self.take_array::<5>()?;
365        let [head, tail @ ..] = buf;
366        *head = FLOAT32_MARKER;
367        *tail = f.to_be_bytes();
368        Ok(())
369    }
370
371    #[inline(always)]
372    fn write_f64(&mut self, f: f64) -> Result<()> {
373        let buf = self.take_array::<9>()?;
374        let [head, tail @ ..] = buf;
375        *head = FLOAT64_MARKER;
376        *tail = f.to_be_bytes();
377        Ok(())
378    }
379
380    #[inline(always)]
381    fn write_string(&mut self, s: &str) -> Result<()> {
382        let len = s.len();
383        match len {
384            // FixStr
385            0..=31 => {
386                let buf = self.take_slice(1 + len)?;
387                unsafe {
388                    let ptr = buf.as_mut_ptr();
389                    *ptr = 0xa0 | (len as u8);
390                    core::ptr::copy_nonoverlapping(s.as_bytes().as_ptr(), ptr.add(1), len);
391                }
392                Ok(())
393            }
394            // Str8
395            32..=255 => {
396                let buf = self.take_slice(2 + len)?;
397                unsafe {
398                    let ptr = buf.as_mut_ptr();
399                    *ptr = STR8_MARKER;
400                    *ptr.add(1) = len as u8;
401                    core::ptr::copy_nonoverlapping(s.as_bytes().as_ptr(), ptr.add(2), len);
402                }
403                Ok(())
404            }
405            // Str16
406            256..=65535 => {
407                let buf = self.take_slice(3 + len)?;
408                unsafe {
409                    let ptr = buf.as_mut_ptr();
410                    *ptr = STR16_MARKER;
411                    core::ptr::copy_nonoverlapping(
412                        (len as u16).to_be_bytes().as_ptr(),
413                        ptr.add(1),
414                        2,
415                    );
416                    core::ptr::copy_nonoverlapping(s.as_bytes().as_ptr(), ptr.add(3), len);
417                }
418                Ok(())
419            }
420            // Str32
421            _ => {
422                let buf = self.take_slice(5 + len)?;
423                unsafe {
424                    let ptr = buf.as_mut_ptr();
425                    *ptr = STR32_MARKER;
426                    core::ptr::copy_nonoverlapping(
427                        (len as u32).to_be_bytes().as_ptr(),
428                        ptr.add(1),
429                        4,
430                    );
431                    core::ptr::copy_nonoverlapping(s.as_bytes().as_ptr(), ptr.add(5), len);
432                }
433                Ok(())
434            }
435        }
436    }
437
438    #[inline(always)]
439    fn write_binary(&mut self, data: &[u8]) -> Result<()> {
440        let len = data.len();
441        match len {
442            // Bin8
443            0..=255 => {
444                let buf = self.take_slice(2 + len)?;
445                unsafe {
446                    let ptr = buf.as_mut_ptr();
447                    *ptr = BIN8_MARKER;
448                    *ptr.add(1) = len as u8;
449                    core::ptr::copy_nonoverlapping(data.as_ptr(), ptr.add(2), len);
450                }
451                Ok(())
452            }
453            // Bin16
454            256..=65535 => {
455                let buf = self.take_slice(3 + len)?;
456                unsafe {
457                    let ptr = buf.as_mut_ptr();
458                    *ptr = BIN16_MARKER;
459                    core::ptr::copy_nonoverlapping(
460                        (len as u16).to_be_bytes().as_ptr(),
461                        ptr.add(1),
462                        2,
463                    );
464                    core::ptr::copy_nonoverlapping(data.as_ptr(), ptr.add(3), len);
465                }
466                Ok(())
467            }
468            // Bin32
469            _ => {
470                let buf = self.take_slice(5 + len)?;
471                unsafe {
472                    let ptr = buf.as_mut_ptr();
473                    *ptr = BIN32_MARKER;
474                    core::ptr::copy_nonoverlapping(
475                        (len as u32).to_be_bytes().as_ptr(),
476                        ptr.add(1),
477                        4,
478                    );
479                    core::ptr::copy_nonoverlapping(data.as_ptr(), ptr.add(5), len);
480                }
481                Ok(())
482            }
483        }
484    }
485
486    #[inline(always)]
487    fn write_timestamp(&mut self, seconds: i64, nanoseconds: u32) -> Result<()> {
488        if nanoseconds >= 1_000_000_000 {
489            return Err(Error::InvalidTimestamp);
490        }
491
492        // timestamp 32: sec in [0, 2^32-1], nsec == 0
493        if nanoseconds == 0 && (0..=u32::MAX as i64).contains(&seconds) {
494            let buf = self.take_array::<6>()?;
495            let [head, type_marker, tail @ ..] = buf;
496            *head = TIMESTAMP32_MARKER;
497            *type_marker = 0xff;
498            *tail = (seconds as u32).to_be_bytes();
499            return Ok(());
500        }
501
502        // timestamp 64: sec in [0, 2^34-1]
503        if (0..=(1i64 << 34) - 1).contains(&seconds) {
504            let data = ((nanoseconds as u64) << 34) | (seconds as u64);
505            let buf = self.take_array::<10>()?;
506            let [head, type_marker, tail @ ..] = buf;
507            *head = TIMESTAMP64_MARKER;
508            *type_marker = 0xff;
509            *tail = data.to_be_bytes();
510            return Ok(());
511        }
512
513        // timestamp 96
514        let buf = self.take_array::<15>()?;
515        let [head, len_marker, type_marker, tail @ ..] = buf;
516        *head = TIMESTAMP96_MARKER;
517        *len_marker = 12;
518        *type_marker = 0xff;
519        unsafe {
520            let tail_ptr = tail.as_mut_ptr();
521            core::ptr::copy_nonoverlapping(nanoseconds.to_be_bytes().as_ptr(), tail_ptr, 4);
522            core::ptr::copy_nonoverlapping(
523                (seconds as i64).to_be_bytes().as_ptr(),
524                tail_ptr.add(4),
525                8,
526            );
527        }
528        Ok(())
529    }
530
531    #[inline(always)]
532    fn write_array_len(&mut self, len: usize) -> Result<()> {
533        match len {
534            0..=15 => {
535                let buf = self.take_array::<1>()?;
536                buf[0] = FIXARRAY_START | (len as u8);
537                Ok(())
538            }
539            16..=65535 => {
540                let buf = self.take_array::<3>()?;
541                let [head, tail @ ..] = buf;
542                *head = ARRAY16_MARKER;
543                *tail = (len as u16).to_be_bytes();
544                Ok(())
545            }
546            _ => {
547                let buf = self.take_array::<5>()?;
548                let [head, tail @ ..] = buf;
549                *head = ARRAY32_MARKER;
550                *tail = (len as u32).to_be_bytes();
551                Ok(())
552            }
553        }
554    }
555
556    #[inline(always)]
557    fn write_map_len(&mut self, len: usize) -> Result<()> {
558        match len {
559            0..=15 => {
560                let buf = self.take_array::<1>()?;
561                buf[0] = FIXMAP_START | (len as u8);
562                Ok(())
563            }
564            16..=65535 => {
565                let buf = self.take_array::<3>()?;
566                let [head, tail @ ..] = buf;
567                *head = MAP16_MARKER;
568                *tail = (len as u16).to_be_bytes();
569                Ok(())
570            }
571            _ => {
572                let buf = self.take_array::<5>()?;
573                let [head, tail @ ..] = buf;
574                *head = MAP32_MARKER;
575                *tail = (len as u32).to_be_bytes();
576                Ok(())
577            }
578        }
579    }
580
581    fn write_ext(&mut self, type_id: i8, data: &[u8]) -> Result<()> {
582        let len = data.len();
583        match len {
584            1 => {
585                let buf = self.take_array::<3>()?;
586                let [head, type_marker, tail] = buf;
587                *head = FIXEXT1_MARKER;
588                *type_marker = type_id as u8;
589                *tail = data[0];
590                Ok(())
591            }
592            2 => {
593                let buf = self.take_array::<4>()?;
594                let [head, type_marker, tail @ ..] = buf;
595                *head = FIXEXT2_MARKER;
596                *type_marker = type_id as u8;
597                *tail = data.try_into().unwrap();
598                Ok(())
599            }
600            4 => {
601                let buf = self.take_array::<6>()?;
602                let [head, type_marker, tail @ ..] = buf;
603                *head = FIXEXT4_MARKER;
604                *type_marker = type_id as u8;
605                *tail = data.try_into().unwrap();
606                Ok(())
607            }
608            8 => {
609                let buf = self.take_array::<10>()?;
610                let [head, type_marker, tail @ ..] = buf;
611                *head = FIXEXT8_MARKER;
612                *type_marker = type_id as u8;
613                *tail = data.try_into().unwrap();
614                Ok(())
615            }
616            16 => {
617                let buf = self.take_array::<18>()?;
618                let [head, type_marker, tail @ ..] = buf;
619                *head = FIXEXT16_MARKER;
620                *type_marker = type_id as u8;
621                *tail = data.try_into().unwrap();
622                Ok(())
623            }
624            0..=255 => {
625                let buf = self.take_slice(2 + len)?;
626                unsafe {
627                    let (header, body) = buf.split_at_mut(2);
628                    header.copy_from_slice(&[EXT8_MARKER, len as u8]);
629                    core::ptr::copy_nonoverlapping(data.as_ptr(), body.as_mut_ptr(), len);
630                }
631                Ok(())
632            }
633            256..=65535 => {
634                let buf = self.take_slice(3 + len)?;
635                unsafe {
636                    let (header, body) = buf.split_at_mut(3);
637                    let len_bytes = (len as u16).to_be_bytes();
638                    header.copy_from_slice(&[EXT16_MARKER, len_bytes[0], len_bytes[1]]);
639                    core::ptr::copy_nonoverlapping(data.as_ptr(), body.as_mut_ptr(), len);
640                }
641                Ok(())
642            }
643            _ => {
644                let buf = self.take_slice(5 + len)?;
645                unsafe {
646                    let (header, body) = buf.split_at_mut(5);
647                    let len_bytes = (len as u32).to_be_bytes();
648                    header.copy_from_slice(&[
649                        EXT32_MARKER,
650                        len_bytes[0],
651                        len_bytes[1],
652                        len_bytes[2],
653                        len_bytes[3],
654                    ]);
655                    core::ptr::copy_nonoverlapping(data.as_ptr(), body.as_mut_ptr(), len);
656                }
657                Ok(())
658            }
659        }
660    }
661}
662
663pub struct VecWriter {
664    buffer: Vec<u8>,
665}
666
667impl VecWriter {
668    pub fn new() -> Self {
669        VecWriter { buffer: Vec::new() }
670    }
671
672    pub fn into_vec(self) -> Vec<u8> {
673        self.buffer
674    }
675}
676
677impl Write for VecWriter {
678    #[inline(always)]
679    fn write_nil(&mut self) -> Result<()> {
680        self.buffer.push(NIL_MARKER);
681        Ok(())
682    }
683
684    #[inline(always)]
685    fn write_boolean(&mut self, b: bool) -> Result<()> {
686        self.buffer.push(if b { TRUE_MARKER } else { FALSE_MARKER });
687        Ok(())
688    }
689
690    #[inline(always)]
691    fn write_u8(&mut self, u: u8) -> Result<()> {
692        if u <= POS_FIXINT_END {
693            self.buffer.push(u);
694        } else {
695            self.buffer.reserve(2);
696            unsafe {
697                let ptr = self.buffer.as_mut_ptr().add(self.buffer.len());
698                *ptr = UINT8_MARKER;
699                *ptr.add(1) = u;
700                self.buffer.set_len(self.buffer.len() + 2);
701            }
702        }
703        Ok(())
704    }
705
706    #[inline(always)]
707    fn write_u16(&mut self, u: u16) -> Result<()> {
708        match u {
709            0..=127 => {
710                self.buffer.push(u as u8);
711                Ok(())
712            }
713            128..=255 => {
714                self.buffer.reserve(2);
715                unsafe {
716                    let ptr = self.buffer.as_mut_ptr().add(self.buffer.len());
717                    *ptr = UINT8_MARKER;
718                    *ptr.add(1) = u as u8;
719                    self.buffer.set_len(self.buffer.len() + 2);
720                }
721                Ok(())
722            }
723            _ => {
724                self.buffer.reserve(3);
725                unsafe {
726                    let ptr = self.buffer.as_mut_ptr().add(self.buffer.len());
727                    *ptr = UINT16_MARKER;
728                    ptr.add(1)
729                        .copy_from_nonoverlapping(u.to_be_bytes().as_ptr(), 2);
730                    self.buffer.set_len(self.buffer.len() + 3);
731                }
732                Ok(())
733            }
734        }
735    }
736
737    #[inline(always)]
738    fn write_u32(&mut self, u: u32) -> Result<()> {
739        match u {
740            0..=127 => {
741                self.buffer.push(u as u8);
742                Ok(())
743            }
744            128..=255 => {
745                self.buffer.reserve(2);
746                unsafe {
747                    let ptr = self.buffer.as_mut_ptr().add(self.buffer.len());
748                    *ptr = UINT8_MARKER;
749                    *ptr.add(1) = u as u8;
750                    self.buffer.set_len(self.buffer.len() + 2);
751                }
752                Ok(())
753            }
754            256..=65535 => {
755                self.buffer.reserve(3);
756                unsafe {
757                    let ptr = self.buffer.as_mut_ptr().add(self.buffer.len());
758                    *ptr = UINT16_MARKER;
759                    ptr.add(1)
760                        .copy_from_nonoverlapping((u as u16).to_be_bytes().as_ptr(), 2);
761                    self.buffer.set_len(self.buffer.len() + 3);
762                }
763                Ok(())
764            }
765            _ => {
766                self.buffer.reserve(5);
767                unsafe {
768                    let ptr = self.buffer.as_mut_ptr().add(self.buffer.len());
769                    *ptr = UINT32_MARKER;
770                    ptr.add(1)
771                        .copy_from_nonoverlapping(u.to_be_bytes().as_ptr(), 4);
772                    self.buffer.set_len(self.buffer.len() + 5);
773                }
774                Ok(())
775            }
776        }
777    }
778
779    #[inline(always)]
780    fn write_u64(&mut self, u: u64) -> Result<()> {
781        match u {
782            0..=127 => {
783                self.buffer.push(u as u8);
784                Ok(())
785            }
786            128..=255 => {
787                self.buffer.reserve(2);
788                unsafe {
789                    let ptr = self.buffer.as_mut_ptr().add(self.buffer.len());
790                    *ptr = UINT8_MARKER;
791                    *ptr.add(1) = u as u8;
792                    self.buffer.set_len(self.buffer.len() + 2);
793                }
794                Ok(())
795            }
796            256..=65535 => {
797                self.buffer.reserve(3);
798                unsafe {
799                    let ptr = self.buffer.as_mut_ptr().add(self.buffer.len());
800                    *ptr = UINT16_MARKER;
801                    ptr.add(1)
802                        .copy_from_nonoverlapping((u as u16).to_be_bytes().as_ptr(), 2);
803                    self.buffer.set_len(self.buffer.len() + 3);
804                }
805                Ok(())
806            }
807            65536..=4294967295 => {
808                self.buffer.reserve(5);
809                unsafe {
810                    let ptr = self.buffer.as_mut_ptr().add(self.buffer.len());
811                    *ptr = UINT32_MARKER;
812                    ptr.add(1)
813                        .copy_from_nonoverlapping((u as u32).to_be_bytes().as_ptr(), 4);
814                    self.buffer.set_len(self.buffer.len() + 5);
815                }
816                Ok(())
817            }
818            _ => {
819                self.buffer.reserve(9);
820                unsafe {
821                    let ptr = self.buffer.as_mut_ptr().add(self.buffer.len());
822                    *ptr = UINT64_MARKER;
823                    ptr.add(1)
824                        .copy_from_nonoverlapping(u.to_be_bytes().as_ptr(), 8);
825                    self.buffer.set_len(self.buffer.len() + 9);
826                }
827                Ok(())
828            }
829        }
830    }
831
832    #[inline(always)]
833    fn write_i8(&mut self, i: i8) -> Result<()> {
834        match i {
835            0..=127 => {
836                self.buffer.push(i as u8);
837                Ok(())
838            }
839            -32..=-1 => {
840                self.buffer.push(0xe0 | ((i + 32) as u8));
841                Ok(())
842            }
843            _ => {
844                self.buffer.reserve(2);
845                unsafe {
846                    let ptr = self.buffer.as_mut_ptr().add(self.buffer.len());
847                    *ptr = INT8_MARKER;
848                    *ptr.add(1) = i as u8;
849                    self.buffer.set_len(self.buffer.len() + 2);
850                }
851                Ok(())
852            }
853        }
854    }
855
856    #[inline(always)]
857    fn write_i16(&mut self, i: i16) -> Result<()> {
858        match i {
859            0..=127 => {
860                self.buffer.push(i as u8);
861                Ok(())
862            }
863            -32..=-1 => {
864                self.buffer.push(0xe0 | ((i + 32) as u8));
865                Ok(())
866            }
867            -128..=127 => {
868                self.buffer.reserve(2);
869                unsafe {
870                    let ptr = self.buffer.as_mut_ptr().add(self.buffer.len());
871                    *ptr = INT8_MARKER;
872                    *ptr.add(1) = i as u8;
873                    self.buffer.set_len(self.buffer.len() + 2);
874                }
875                Ok(())
876            }
877            _ => {
878                self.buffer.reserve(3);
879                unsafe {
880                    let ptr = self.buffer.as_mut_ptr().add(self.buffer.len());
881                    *ptr = INT16_MARKER;
882                    ptr.add(1)
883                        .copy_from_nonoverlapping((i as i16).to_be_bytes().as_ptr(), 2);
884                    self.buffer.set_len(self.buffer.len() + 3);
885                }
886                Ok(())
887            }
888        }
889    }
890
891    #[inline(always)]
892    fn write_i32(&mut self, i: i32) -> Result<()> {
893        match i {
894            0..=127 => {
895                self.buffer.push(i as u8);
896                Ok(())
897            }
898            -32..=-1 => {
899                self.buffer.push(0xe0 | ((i + 32) as u8));
900                Ok(())
901            }
902            -128..=127 => {
903                self.buffer.reserve(2);
904                unsafe {
905                    let ptr = self.buffer.as_mut_ptr().add(self.buffer.len());
906                    *ptr = INT8_MARKER;
907                    *ptr.add(1) = i as u8;
908                    self.buffer.set_len(self.buffer.len() + 2);
909                }
910                Ok(())
911            }
912            -32768..=32767 => {
913                self.buffer.reserve(3);
914                unsafe {
915                    let ptr = self.buffer.as_mut_ptr().add(self.buffer.len());
916                    *ptr = INT16_MARKER;
917                    ptr.add(1)
918                        .copy_from_nonoverlapping((i as i16).to_be_bytes().as_ptr(), 2);
919                    self.buffer.set_len(self.buffer.len() + 3);
920                }
921                Ok(())
922            }
923            _ => {
924                self.buffer.reserve(5);
925                unsafe {
926                    let ptr = self.buffer.as_mut_ptr().add(self.buffer.len());
927                    *ptr = INT32_MARKER;
928                    ptr.add(1)
929                        .copy_from_nonoverlapping((i as i32).to_be_bytes().as_ptr(), 4);
930                    self.buffer.set_len(self.buffer.len() + 5);
931                }
932                Ok(())
933            }
934        }
935    }
936
937    #[inline(always)]
938    fn write_i64(&mut self, i: i64) -> Result<()> {
939        match i {
940            0..=127 => {
941                self.buffer.push(i as u8);
942                Ok(())
943            }
944            -32..=-1 => {
945                self.buffer.push(0xe0 | ((i + 32) as u8));
946                Ok(())
947            }
948            -128..=127 => {
949                self.buffer.reserve(2);
950                unsafe {
951                    let ptr = self.buffer.as_mut_ptr().add(self.buffer.len());
952                    *ptr = INT8_MARKER;
953                    *ptr.add(1) = i as u8;
954                    self.buffer.set_len(self.buffer.len() + 2);
955                }
956                Ok(())
957            }
958            -32768..=32767 => {
959                self.buffer.reserve(3);
960                unsafe {
961                    let ptr = self.buffer.as_mut_ptr().add(self.buffer.len());
962                    *ptr = INT16_MARKER;
963                    ptr.add(1)
964                        .copy_from_nonoverlapping((i as i16).to_be_bytes().as_ptr(), 2);
965                    self.buffer.set_len(self.buffer.len() + 3);
966                }
967                Ok(())
968            }
969            -2147483648..=2147483647 => {
970                self.buffer.reserve(5);
971                unsafe {
972                    let ptr = self.buffer.as_mut_ptr().add(self.buffer.len());
973                    *ptr = INT32_MARKER;
974                    ptr.add(1)
975                        .copy_from_nonoverlapping((i as i32).to_be_bytes().as_ptr(), 4);
976                    self.buffer.set_len(self.buffer.len() + 5);
977                }
978                Ok(())
979            }
980            _ => {
981                self.buffer.reserve(9);
982                unsafe {
983                    let ptr = self.buffer.as_mut_ptr().add(self.buffer.len());
984                    *ptr = INT64_MARKER;
985                    ptr.add(1)
986                        .copy_from_nonoverlapping(i.to_be_bytes().as_ptr(), 8);
987                    self.buffer.set_len(self.buffer.len() + 9);
988                }
989                Ok(())
990            }
991        }
992    }
993
994    #[inline(always)]
995    fn write_f32(&mut self, f: f32) -> Result<()> {
996        self.buffer.reserve(5);
997        unsafe {
998            let ptr = self.buffer.as_mut_ptr().add(self.buffer.len());
999            *ptr = FLOAT32_MARKER;
1000            ptr.add(1)
1001                .copy_from_nonoverlapping(f.to_be_bytes().as_ptr(), 4);
1002            self.buffer.set_len(self.buffer.len() + 5);
1003        }
1004        Ok(())
1005    }
1006
1007    #[inline(always)]
1008    fn write_f64(&mut self, f: f64) -> Result<()> {
1009        self.buffer.reserve(9);
1010        unsafe {
1011            let ptr = self.buffer.as_mut_ptr().add(self.buffer.len());
1012            *ptr = FLOAT64_MARKER;
1013            ptr.add(1)
1014                .copy_from_nonoverlapping(f.to_be_bytes().as_ptr(), 8);
1015            self.buffer.set_len(self.buffer.len() + 9);
1016        }
1017        Ok(())
1018    }
1019
1020    #[inline(always)]
1021    fn write_string(&mut self, s: &str) -> Result<()> {
1022        let len = s.len();
1023        match len {
1024            0..=31 => {
1025                self.buffer.reserve(1 + len);
1026                unsafe {
1027                    let ptr = self.buffer.as_mut_ptr().add(self.buffer.len());
1028                    *ptr = 0xa0 | (len as u8);
1029                    ptr.add(1)
1030                        .copy_from_nonoverlapping(s.as_bytes().as_ptr(), len);
1031                    self.buffer.set_len(self.buffer.len() + 1 + len);
1032                }
1033                Ok(())
1034            }
1035            32..=255 => {
1036                self.buffer.reserve(2 + len);
1037                unsafe {
1038                    let ptr = self.buffer.as_mut_ptr().add(self.buffer.len());
1039                    *ptr = STR8_MARKER;
1040                    *ptr.add(1) = len as u8;
1041                    ptr.add(2)
1042                        .copy_from_nonoverlapping(s.as_bytes().as_ptr(), len);
1043                    self.buffer.set_len(self.buffer.len() + 2 + len);
1044                }
1045                Ok(())
1046            }
1047            256..=65535 => {
1048                self.buffer.reserve(3 + len);
1049                unsafe {
1050                    let ptr = self.buffer.as_mut_ptr().add(self.buffer.len());
1051                    *ptr = STR16_MARKER;
1052                    let len_bytes = (len as u16).to_be_bytes();
1053                    ptr.add(1).copy_from_nonoverlapping(len_bytes.as_ptr(), 2);
1054                    ptr.add(3)
1055                        .copy_from_nonoverlapping(s.as_bytes().as_ptr(), len);
1056                    self.buffer.set_len(self.buffer.len() + 3 + len);
1057                }
1058                Ok(())
1059            }
1060            _ => {
1061                self.buffer.reserve(5 + len);
1062                unsafe {
1063                    let ptr = self.buffer.as_mut_ptr().add(self.buffer.len());
1064                    *ptr = STR32_MARKER;
1065                    let len_bytes = (len as u32).to_be_bytes();
1066                    ptr.add(1).copy_from_nonoverlapping(len_bytes.as_ptr(), 4);
1067                    ptr.add(5)
1068                        .copy_from_nonoverlapping(s.as_bytes().as_ptr(), len);
1069                    self.buffer.set_len(self.buffer.len() + 5 + len);
1070                }
1071                Ok(())
1072            }
1073        }
1074    }
1075
1076    #[inline(always)]
1077    fn write_binary(&mut self, data: &[u8]) -> Result<()> {
1078        let len = data.len();
1079        match len {
1080            0..=255 => {
1081                self.buffer.reserve(2 + len);
1082                unsafe {
1083                    let ptr = self.buffer.as_mut_ptr().add(self.buffer.len());
1084                    *ptr = BIN8_MARKER;
1085                    *ptr.add(1) = len as u8;
1086                    ptr.add(2).copy_from_nonoverlapping(data.as_ptr(), len);
1087                    self.buffer.set_len(self.buffer.len() + 2 + len);
1088                }
1089                Ok(())
1090            }
1091            256..=65535 => {
1092                self.buffer.reserve(3 + len);
1093                unsafe {
1094                    let ptr = self.buffer.as_mut_ptr().add(self.buffer.len());
1095                    *ptr = BIN16_MARKER;
1096                    let len_bytes = (len as u16).to_be_bytes();
1097                    ptr.add(1).copy_from_nonoverlapping(len_bytes.as_ptr(), 2);
1098                    ptr.add(3).copy_from_nonoverlapping(data.as_ptr(), len);
1099                    self.buffer.set_len(self.buffer.len() + 3 + len);
1100                }
1101                Ok(())
1102            }
1103            _ => {
1104                self.buffer.reserve(5 + len);
1105                unsafe {
1106                    let ptr = self.buffer.as_mut_ptr().add(self.buffer.len());
1107                    *ptr = BIN32_MARKER;
1108                    let len_bytes = (len as u32).to_be_bytes();
1109                    ptr.add(1).copy_from_nonoverlapping(len_bytes.as_ptr(), 4);
1110                    ptr.add(5).copy_from_nonoverlapping(data.as_ptr(), len);
1111                    self.buffer.set_len(self.buffer.len() + 5 + len);
1112                }
1113                Ok(())
1114            }
1115        }
1116    }
1117
1118    #[inline(always)]
1119    fn write_timestamp(&mut self, seconds: i64, nanoseconds: u32) -> Result<()> {
1120        if nanoseconds >= 1_000_000_000 {
1121            return Err(Error::InvalidTimestamp);
1122        }
1123
1124        // timestamp 32: sec in [0, 2^32-1], nsec == 0
1125        if nanoseconds == 0 && (0..=u32::MAX as i64).contains(&seconds) {
1126            self.buffer.reserve(6);
1127            unsafe {
1128                let ptr = self.buffer.as_mut_ptr().add(self.buffer.len());
1129                *ptr = TIMESTAMP32_MARKER;
1130                *ptr.add(1) = 0xff;
1131                ptr.add(2)
1132                    .copy_from_nonoverlapping((seconds as u32).to_be_bytes().as_ptr(), 4);
1133                self.buffer.set_len(self.buffer.len() + 6);
1134            }
1135            return Ok(());
1136        }
1137
1138        // timestamp 64: sec in [0, 2^34-1]
1139        if (0..=(1i64 << 34) - 1).contains(&seconds) {
1140            let data = ((nanoseconds as u64) << 34) | (seconds as u64);
1141            self.buffer.reserve(10);
1142            unsafe {
1143                let ptr = self.buffer.as_mut_ptr().add(self.buffer.len());
1144                *ptr = TIMESTAMP64_MARKER;
1145                *ptr.add(1) = 0xff;
1146                ptr.add(2)
1147                    .copy_from_nonoverlapping(data.to_be_bytes().as_ptr(), 8);
1148                self.buffer.set_len(self.buffer.len() + 10);
1149            }
1150            return Ok(());
1151        }
1152
1153        // timestamp 96
1154        self.buffer.reserve(15);
1155        unsafe {
1156            let ptr = self.buffer.as_mut_ptr().add(self.buffer.len());
1157            *ptr = TIMESTAMP96_MARKER;
1158            *ptr.add(1) = 12;
1159            *ptr.add(2) = 0xff;
1160            ptr.add(3)
1161                .copy_from_nonoverlapping(nanoseconds.to_be_bytes().as_ptr(), 4);
1162            ptr.add(7)
1163                .copy_from_nonoverlapping((seconds as i64).to_be_bytes().as_ptr(), 8);
1164            self.buffer.set_len(self.buffer.len() + 15);
1165        }
1166        Ok(())
1167    }
1168
1169    #[inline(always)]
1170    fn write_array_len(&mut self, len: usize) -> Result<()> {
1171        match len {
1172            0..=15 => {
1173                self.buffer.push(FIXARRAY_START | (len as u8));
1174                Ok(())
1175            }
1176            16..=65535 => {
1177                self.buffer.reserve(3);
1178                unsafe {
1179                    let ptr = self.buffer.as_mut_ptr().add(self.buffer.len());
1180                    *ptr = ARRAY16_MARKER;
1181                    ptr.add(1)
1182                        .copy_from_nonoverlapping((len as u16).to_be_bytes().as_ptr(), 2);
1183                    self.buffer.set_len(self.buffer.len() + 3);
1184                }
1185                Ok(())
1186            }
1187            _ => {
1188                self.buffer.reserve(5);
1189                unsafe {
1190                    let ptr = self.buffer.as_mut_ptr().add(self.buffer.len());
1191                    *ptr = ARRAY32_MARKER;
1192                    ptr.add(1)
1193                        .copy_from_nonoverlapping((len as u32).to_be_bytes().as_ptr(), 4);
1194                    self.buffer.set_len(self.buffer.len() + 5);
1195                }
1196                Ok(())
1197            }
1198        }
1199    }
1200
1201    #[inline(always)]
1202    fn write_map_len(&mut self, len: usize) -> Result<()> {
1203        match len {
1204            0..=15 => {
1205                self.buffer.push(FIXMAP_START | (len as u8));
1206                Ok(())
1207            }
1208            16..=65535 => {
1209                self.buffer.reserve(3);
1210                unsafe {
1211                    let ptr = self.buffer.as_mut_ptr().add(self.buffer.len());
1212                    *ptr = MAP16_MARKER;
1213                    ptr.add(1)
1214                        .copy_from_nonoverlapping((len as u16).to_be_bytes().as_ptr(), 2);
1215                    self.buffer.set_len(self.buffer.len() + 3);
1216                }
1217                Ok(())
1218            }
1219            _ => {
1220                self.buffer.reserve(5);
1221                unsafe {
1222                    let ptr = self.buffer.as_mut_ptr().add(self.buffer.len());
1223                    *ptr = MAP32_MARKER;
1224                    ptr.add(1)
1225                        .copy_from_nonoverlapping((len as u32).to_be_bytes().as_ptr(), 4);
1226                    self.buffer.set_len(self.buffer.len() + 5);
1227                }
1228                Ok(())
1229            }
1230        }
1231    }
1232
1233    #[inline(always)]
1234    fn write_ext(&mut self, type_id: i8, data: &[u8]) -> Result<()> {
1235        let len = data.len();
1236        match len {
1237            1 => {
1238                self.buffer.reserve(3);
1239                unsafe {
1240                    let ptr = self.buffer.as_mut_ptr().add(self.buffer.len());
1241                    *ptr = FIXEXT1_MARKER;
1242                    *ptr.add(1) = type_id as u8;
1243                    *ptr.add(2) = data[0];
1244                    self.buffer.set_len(self.buffer.len() + 3);
1245                }
1246                Ok(())
1247            }
1248            2 => {
1249                self.buffer.reserve(4);
1250                unsafe {
1251                    let ptr = self.buffer.as_mut_ptr().add(self.buffer.len());
1252                    *ptr = FIXEXT2_MARKER;
1253                    *ptr.add(1) = type_id as u8;
1254                    ptr.add(2).copy_from_nonoverlapping(data.as_ptr(), 2);
1255                    self.buffer.set_len(self.buffer.len() + 4);
1256                }
1257                Ok(())
1258            }
1259            4 => {
1260                self.buffer.reserve(6);
1261                unsafe {
1262                    let ptr = self.buffer.as_mut_ptr().add(self.buffer.len());
1263                    *ptr = FIXEXT4_MARKER;
1264                    *ptr.add(1) = type_id as u8;
1265                    ptr.add(2).copy_from_nonoverlapping(data.as_ptr(), 4);
1266                    self.buffer.set_len(self.buffer.len() + 6);
1267                }
1268                Ok(())
1269            }
1270            8 => {
1271                self.buffer.reserve(10);
1272                unsafe {
1273                    let ptr = self.buffer.as_mut_ptr().add(self.buffer.len());
1274                    *ptr = FIXEXT8_MARKER;
1275                    *ptr.add(1) = type_id as u8;
1276                    ptr.add(2).copy_from_nonoverlapping(data.as_ptr(), 8);
1277                    self.buffer.set_len(self.buffer.len() + 10);
1278                }
1279                Ok(())
1280            }
1281            16 => {
1282                self.buffer.reserve(18);
1283                unsafe {
1284                    let ptr = self.buffer.as_mut_ptr().add(self.buffer.len());
1285                    *ptr = FIXEXT16_MARKER;
1286                    *ptr.add(1) = type_id as u8;
1287                    ptr.add(2).copy_from_nonoverlapping(data.as_ptr(), 16);
1288                    self.buffer.set_len(self.buffer.len() + 18);
1289                }
1290                Ok(())
1291            }
1292            0..=255 => {
1293                self.buffer.reserve(2 + len);
1294                unsafe {
1295                    let ptr = self.buffer.as_mut_ptr().add(self.buffer.len());
1296                    *ptr = EXT8_MARKER;
1297                    *ptr.add(1) = len as u8;
1298                    ptr.add(2).copy_from_nonoverlapping(data.as_ptr(), len);
1299                    self.buffer.set_len(self.buffer.len() + 2 + len);
1300                }
1301                Ok(())
1302            }
1303            256..=65535 => {
1304                self.buffer.reserve(3 + len);
1305                unsafe {
1306                    let ptr = self.buffer.as_mut_ptr().add(self.buffer.len());
1307                    *ptr = EXT16_MARKER;
1308                    let len_bytes = (len as u16).to_be_bytes();
1309                    ptr.add(1).copy_from_nonoverlapping(len_bytes.as_ptr(), 2);
1310                    ptr.add(3).copy_from_nonoverlapping(data.as_ptr(), len);
1311                    self.buffer.set_len(self.buffer.len() + 3 + len);
1312                }
1313                Ok(())
1314            }
1315            _ => {
1316                self.buffer.reserve(5 + len);
1317                unsafe {
1318                    let ptr = self.buffer.as_mut_ptr().add(self.buffer.len());
1319                    *ptr = EXT32_MARKER;
1320                    let len_bytes = (len as u32).to_be_bytes();
1321                    ptr.add(1).copy_from_nonoverlapping(len_bytes.as_ptr(), 4);
1322                    ptr.add(5).copy_from_nonoverlapping(data.as_ptr(), len);
1323                    self.buffer.set_len(self.buffer.len() + 5 + len);
1324                }
1325                Ok(())
1326            }
1327        }
1328    }
1329}
1330
1331#[cfg(feature = "std")]
1332pub struct IOWriter<W: std::io::Write> {
1333    writer: W,
1334}
1335
1336#[cfg(feature = "std")]
1337impl<W: std::io::Write> IOWriter<W> {
1338    pub fn new(writer: W) -> Self {
1339        IOWriter { writer }
1340    }
1341
1342    #[inline(always)]
1343    fn write_all(&mut self, data: &[u8]) -> Result<()> {
1344        self.writer.write_all(data).map_err(|e| Error::IoError(e))
1345    }
1346}
1347
1348#[cfg(feature = "std")]
1349impl<W: std::io::Write> Write for IOWriter<W> {
1350    #[inline(always)]
1351    fn write_nil(&mut self) -> Result<()> {
1352        self.write_all(&[NIL_MARKER])?;
1353        Ok(())
1354    }
1355
1356    #[inline(always)]
1357    fn write_boolean(&mut self, b: bool) -> Result<()> {
1358        self.write_all(&[if b { TRUE_MARKER } else { FALSE_MARKER }])?;
1359        Ok(())
1360    }
1361
1362    #[inline(always)]
1363    fn write_u8(&mut self, u: u8) -> Result<()> {
1364        if u <= 127 {
1365            self.write_all(&[u])?;
1366        } else {
1367            self.write_all(&[UINT8_MARKER, u])?;
1368        }
1369        Ok(())
1370    }
1371
1372    #[inline(always)]
1373    fn write_u16(&mut self, u: u16) -> Result<()> {
1374        match u {
1375            0..=127 => {
1376                self.write_all(&[u as u8])?;
1377                Ok(())
1378            }
1379            128..=255 => {
1380                self.write_all(&[UINT8_MARKER, u as u8])?;
1381                Ok(())
1382            }
1383            _ => {
1384                let len_bytes = (u as u16).to_be_bytes();
1385                self.write_all(&[UINT16_MARKER, len_bytes[0], len_bytes[1]])?;
1386                Ok(())
1387            }
1388        }
1389    }
1390
1391    #[inline(always)]
1392    fn write_u32(&mut self, u: u32) -> Result<()> {
1393        match u {
1394            0..=127 => {
1395                self.write_all(&[u as u8])?;
1396                Ok(())
1397            }
1398            128..=255 => {
1399                self.write_all(&[UINT8_MARKER, u as u8])?;
1400                Ok(())
1401            }
1402            256..=65535 => {
1403                let len_bytes = (u as u16).to_be_bytes();
1404                self.write_all(&[UINT16_MARKER, len_bytes[0], len_bytes[1]])?;
1405                Ok(())
1406            }
1407            _ => {
1408                let len_bytes = u.to_be_bytes();
1409                self.write_all(&[
1410                    UINT32_MARKER,
1411                    len_bytes[0],
1412                    len_bytes[1],
1413                    len_bytes[2],
1414                    len_bytes[3],
1415                ])?;
1416                Ok(())
1417            }
1418        }
1419    }
1420
1421    #[inline(always)]
1422    fn write_u64(&mut self, u: u64) -> Result<()> {
1423        match u {
1424            0..=127 => {
1425                self.write_all(&[u as u8])?;
1426                Ok(())
1427            }
1428            128..=255 => {
1429                self.write_all(&[UINT8_MARKER, u as u8])?;
1430                Ok(())
1431            }
1432            256..=65535 => {
1433                let len_bytes = (u as u16).to_be_bytes();
1434                self.write_all(&[UINT16_MARKER, len_bytes[0], len_bytes[1]])?;
1435                Ok(())
1436            }
1437            65536..=4294967295 => {
1438                let len_bytes = (u as u32).to_be_bytes();
1439                self.write_all(&[
1440                    UINT32_MARKER,
1441                    len_bytes[0],
1442                    len_bytes[1],
1443                    len_bytes[2],
1444                    len_bytes[3],
1445                ])?;
1446                Ok(())
1447            }
1448            _ => {
1449                let len_bytes = u.to_be_bytes();
1450                self.write_all(&[
1451                    UINT64_MARKER,
1452                    len_bytes[0],
1453                    len_bytes[1],
1454                    len_bytes[2],
1455                    len_bytes[3],
1456                    len_bytes[4],
1457                    len_bytes[5],
1458                    len_bytes[6],
1459                    len_bytes[7],
1460                ])?;
1461                Ok(())
1462            }
1463        }
1464    }
1465
1466    #[inline(always)]
1467    fn write_i8(&mut self, i: i8) -> Result<()> {
1468        match i {
1469            0..=127 => {
1470                self.write_all(&[i as u8])?;
1471                Ok(())
1472            }
1473            -32..=-1 => {
1474                self.write_all(&[0xe0 | ((i + 32) as u8)])?;
1475                Ok(())
1476            }
1477            _ => {
1478                self.write_all(&[INT8_MARKER, i as u8])?;
1479                Ok(())
1480            }
1481        }
1482    }
1483
1484    #[inline(always)]
1485    fn write_i16(&mut self, i: i16) -> Result<()> {
1486        match i {
1487            0..=127 => {
1488                self.write_all(&[i as u8])?;
1489                Ok(())
1490            }
1491            -32..=-1 => {
1492                self.write_all(&[0xe0 | ((i + 32) as u8)])?;
1493                Ok(())
1494            }
1495            -128..=127 => {
1496                self.write_all(&[INT8_MARKER, i as u8])?;
1497                Ok(())
1498            }
1499            _ => {
1500                let len_bytes = (i as i16).to_be_bytes();
1501                self.write_all(&[INT16_MARKER, len_bytes[0], len_bytes[1]])?;
1502                Ok(())
1503            }
1504        }
1505    }
1506
1507    #[inline(always)]
1508    fn write_i32(&mut self, i: i32) -> Result<()> {
1509        match i {
1510            0..=127 => {
1511                self.write_all(&[i as u8])?;
1512                Ok(())
1513            }
1514            -32..=-1 => {
1515                self.write_all(&[0xe0 | ((i + 32) as u8)])?;
1516                Ok(())
1517            }
1518            -128..=127 => {
1519                self.write_all(&[INT8_MARKER, i as u8])?;
1520                Ok(())
1521            }
1522            -32768..=32767 => {
1523                let len_bytes = (i as i16).to_be_bytes();
1524                self.write_all(&[INT16_MARKER, len_bytes[0], len_bytes[1]])?;
1525                Ok(())
1526            }
1527            _ => {
1528                let len_bytes = (i as i32).to_be_bytes();
1529                self.write_all(&[
1530                    INT32_MARKER,
1531                    len_bytes[0],
1532                    len_bytes[1],
1533                    len_bytes[2],
1534                    len_bytes[3],
1535                ])?;
1536                Ok(())
1537            }
1538        }
1539    }
1540
1541    #[inline(always)]
1542    fn write_i64(&mut self, i: i64) -> Result<()> {
1543        match i {
1544            0..=127 => {
1545                self.write_all(&[i as u8])?;
1546                Ok(())
1547            }
1548            -32..=-1 => {
1549                self.write_all(&[0xe0 | ((i + 32) as u8)])?;
1550                Ok(())
1551            }
1552            -128..=127 => {
1553                self.write_all(&[INT8_MARKER, i as u8])?;
1554                Ok(())
1555            }
1556            -32768..=32767 => {
1557                let len_bytes = (i as i16).to_be_bytes();
1558                self.write_all(&[INT16_MARKER, len_bytes[0], len_bytes[1]])?;
1559                Ok(())
1560            }
1561            -2147483648..=2147483647 => {
1562                let len_bytes = (i as i32).to_be_bytes();
1563                self.write_all(&[
1564                    INT32_MARKER,
1565                    len_bytes[0],
1566                    len_bytes[1],
1567                    len_bytes[2],
1568                    len_bytes[3],
1569                ])?;
1570                Ok(())
1571            }
1572            _ => {
1573                let len_bytes = (i as i64).to_be_bytes();
1574                self.write_all(&[
1575                    INT64_MARKER,
1576                    len_bytes[0],
1577                    len_bytes[1],
1578                    len_bytes[2],
1579                    len_bytes[3],
1580                    len_bytes[4],
1581                    len_bytes[5],
1582                    len_bytes[6],
1583                    len_bytes[7],
1584                ])?;
1585                Ok(())
1586            }
1587        }
1588    }
1589
1590    #[inline(always)]
1591    fn write_f32(&mut self, f: f32) -> Result<()> {
1592        let len_bytes = f.to_be_bytes();
1593        self.write_all(&[
1594            FLOAT32_MARKER,
1595            len_bytes[0],
1596            len_bytes[1],
1597            len_bytes[2],
1598            len_bytes[3],
1599        ])?;
1600        Ok(())
1601    }
1602
1603    #[inline(always)]
1604    fn write_f64(&mut self, f: f64) -> Result<()> {
1605        let len_bytes = f.to_be_bytes();
1606        self.write_all(&[
1607            FLOAT64_MARKER,
1608            len_bytes[0],
1609            len_bytes[1],
1610            len_bytes[2],
1611            len_bytes[3],
1612            len_bytes[4],
1613            len_bytes[5],
1614            len_bytes[6],
1615            len_bytes[7],
1616        ])?;
1617        Ok(())
1618    }
1619
1620    fn write_string(&mut self, s: &str) -> Result<()> {
1621        let len = s.len();
1622        match len {
1623            0..=31 => {
1624                self.write_all(&[0xa0 | (len as u8)])?;
1625                self.write_all(s.as_bytes())?;
1626                Ok(())
1627            }
1628            32..=255 => {
1629                self.write_all(&[STR8_MARKER, len as u8])?;
1630                self.write_all(s.as_bytes())?;
1631                Ok(())
1632            }
1633            256..=65535 => {
1634                let len_bytes = (len as u16).to_be_bytes();
1635                self.write_all(&[STR16_MARKER, len_bytes[0], len_bytes[1]])?;
1636                self.write_all(s.as_bytes())?;
1637                Ok(())
1638            }
1639            _ => {
1640                let len_bytes = (len as u32).to_be_bytes();
1641                self.write_all(&[
1642                    STR32_MARKER,
1643                    len_bytes[0],
1644                    len_bytes[1],
1645                    len_bytes[2],
1646                    len_bytes[3],
1647                ])?;
1648                self.write_all(s.as_bytes())?;
1649                Ok(())
1650            }
1651        }
1652    }
1653
1654    #[inline(always)]
1655    fn write_binary(&mut self, data: &[u8]) -> Result<()> {
1656        let len = data.len();
1657        match len {
1658            0..=31 => {
1659                self.write_all(&[0xb0 | (len as u8)])?;
1660                self.write_all(data)?;
1661                Ok(())
1662            }
1663            32..=255 => {
1664                self.write_all(&[BIN8_MARKER, len as u8])?;
1665                self.write_all(data)?;
1666                Ok(())
1667            }
1668            256..=65535 => {
1669                let len_bytes = (len as u16).to_be_bytes();
1670                self.write_all(&[BIN16_MARKER, len_bytes[0], len_bytes[1]])?;
1671                self.write_all(data)?;
1672                Ok(())
1673            }
1674            _ => {
1675                let len_bytes = (len as u32).to_be_bytes();
1676                self.write_all(&[
1677                    BIN32_MARKER,
1678                    len_bytes[0],
1679                    len_bytes[1],
1680                    len_bytes[2],
1681                    len_bytes[3],
1682                ])?;
1683                self.write_all(data)?;
1684                Ok(())
1685            }
1686        }
1687    }
1688
1689    #[inline(always)]
1690    fn write_timestamp(&mut self, seconds: i64, nanoseconds: u32) -> Result<()> {
1691        if nanoseconds >= 1_000_000_000 {
1692            return Err(Error::InvalidTimestamp);
1693        }
1694
1695        // timestamp 32: sec in [0, 2^32-1], nsec == 0
1696        if nanoseconds == 0 && (0..=u32::MAX as i64).contains(&seconds) {
1697            let sec_bytes = (seconds as u32).to_be_bytes();
1698            self.write_all(&[
1699                TIMESTAMP32_MARKER,
1700                0xff,
1701                sec_bytes[0],
1702                sec_bytes[1],
1703                sec_bytes[2],
1704                sec_bytes[3],
1705            ])?;
1706            return Ok(());
1707        }
1708
1709        // timestamp 64: sec in [0, 2^34-1]
1710        if (0..=(1i64 << 34) - 1).contains(&seconds) {
1711            let data = ((nanoseconds as u64) << 34) | (seconds as u64);
1712            let data_bytes = data.to_be_bytes();
1713            self.write_all(&[
1714                TIMESTAMP64_MARKER,
1715                0xff,
1716                data_bytes[0],
1717                data_bytes[1],
1718                data_bytes[2],
1719                data_bytes[3],
1720                data_bytes[4],
1721                data_bytes[5],
1722                data_bytes[6],
1723                data_bytes[7],
1724            ])?;
1725            return Ok(());
1726        }
1727
1728        // timestamp 96
1729        let sec_bytes = (seconds as i64).to_be_bytes();
1730        let nsec_bytes = nanoseconds.to_be_bytes();
1731        self.write_all(&[
1732            TIMESTAMP96_MARKER,
1733            12,
1734            0xff,
1735            nsec_bytes[0],
1736            nsec_bytes[1],
1737            nsec_bytes[2],
1738            nsec_bytes[3],
1739            sec_bytes[0],
1740            sec_bytes[1],
1741            sec_bytes[2],
1742            sec_bytes[3],
1743            sec_bytes[4],
1744            sec_bytes[5],
1745            sec_bytes[6],
1746            sec_bytes[7],
1747        ])?;
1748        Ok(())
1749    }
1750
1751    #[inline(always)]
1752    fn write_array_len(&mut self, len: usize) -> Result<()> {
1753        match len {
1754            0..=15 => {
1755                self.write_all(&[FIXARRAY_START | (len as u8)])?;
1756                Ok(())
1757            }
1758            16..=65535 => {
1759                let len_bytes = (len as u16).to_be_bytes();
1760                self.write_all(&[ARRAY16_MARKER, len_bytes[0], len_bytes[1]])?;
1761                Ok(())
1762            }
1763            _ => {
1764                let len_bytes = (len as u32).to_be_bytes();
1765                self.write_all(&[
1766                    ARRAY32_MARKER,
1767                    len_bytes[0],
1768                    len_bytes[1],
1769                    len_bytes[2],
1770                    len_bytes[3],
1771                ])?;
1772                Ok(())
1773            }
1774        }
1775    }
1776
1777    #[inline(always)]
1778    fn write_map_len(&mut self, len: usize) -> Result<()> {
1779        match len {
1780            0..=15 => {
1781                self.write_all(&[FIXMAP_START | (len as u8)])?;
1782                Ok(())
1783            }
1784            16..=65535 => {
1785                let len_bytes = (len as u16).to_be_bytes();
1786                self.write_all(&[MAP16_MARKER, len_bytes[0], len_bytes[1]])?;
1787                Ok(())
1788            }
1789            _ => {
1790                let len_bytes = (len as u32).to_be_bytes();
1791                self.write_all(&[
1792                    MAP32_MARKER,
1793                    len_bytes[0],
1794                    len_bytes[1],
1795                    len_bytes[2],
1796                    len_bytes[3],
1797                ])?;
1798                Ok(())
1799            }
1800        }
1801    }
1802
1803    #[inline(always)]
1804    fn write_ext(&mut self, type_id: i8, data: &[u8]) -> Result<()> {
1805        let len = data.len();
1806        match len {
1807            1 => {
1808                self.write_all(&[FIXEXT1_MARKER, type_id as u8, data[0]])?;
1809                Ok(())
1810            }
1811            2 => {
1812                self.write_all(&[FIXEXT2_MARKER, type_id as u8, data[0], data[1]])?;
1813                Ok(())
1814            }
1815            4 => {
1816                self.write_all(&[
1817                    FIXEXT4_MARKER,
1818                    type_id as u8,
1819                    data[0],
1820                    data[1],
1821                    data[2],
1822                    data[3],
1823                ])?;
1824                Ok(())
1825            }
1826            8 => {
1827                self.write_all(&[
1828                    FIXEXT8_MARKER,
1829                    type_id as u8,
1830                    data[0],
1831                    data[1],
1832                    data[2],
1833                    data[3],
1834                    data[4],
1835                    data[5],
1836                    data[6],
1837                    data[7],
1838                ])?;
1839                Ok(())
1840            }
1841            16 => {
1842                self.write_all(&[
1843                    FIXEXT16_MARKER,
1844                    type_id as u8,
1845                    data[0],
1846                    data[1],
1847                    data[2],
1848                    data[3],
1849                    data[4],
1850                    data[5],
1851                    data[6],
1852                    data[7],
1853                    data[8],
1854                    data[9],
1855                    data[10],
1856                    data[11],
1857                    data[12],
1858                    data[13],
1859                    data[14],
1860                    data[15],
1861                ])?;
1862                Ok(())
1863            }
1864            0..=255 => {
1865                self.write_all(&[EXT8_MARKER, len as u8, type_id as u8])?;
1866                self.write_all(data)?;
1867                Ok(())
1868            }
1869            256..=65535 => {
1870                let len_bytes = (len as u16).to_be_bytes();
1871                self.write_all(&[EXT16_MARKER, len_bytes[0], len_bytes[1]])?;
1872                self.write_all(data)?;
1873                Ok(())
1874            }
1875            _ => {
1876                let len_bytes = (len as u32).to_be_bytes();
1877                self.write_all(&[
1878                    EXT32_MARKER,
1879                    len_bytes[0],
1880                    len_bytes[1],
1881                    len_bytes[2],
1882                    len_bytes[3],
1883                ])?;
1884                self.write_all(data)?;
1885                Ok(())
1886            }
1887        }
1888    }
1889}