1use alloc::vec::Vec;
2
3use crate::{Error, Result, consts::*};
4
5pub trait Write {
25 fn write_nil(&mut self) -> Result<()>;
27
28 fn write_boolean(&mut self, b: bool) -> Result<()>;
30
31 fn write_u8(&mut self, u: u8) -> Result<()>;
33
34 fn write_u16(&mut self, u: u16) -> Result<()>;
36
37 fn write_u32(&mut self, u: u32) -> Result<()>;
39
40 fn write_u64(&mut self, u: u64) -> Result<()>;
42
43 fn write_i8(&mut self, i: i8) -> Result<()>;
45
46 fn write_i16(&mut self, i: i16) -> Result<()>;
48
49 fn write_i32(&mut self, i: i32) -> Result<()>;
51
52 fn write_i64(&mut self, i: i64) -> Result<()>;
54
55 fn write_f32(&mut self, f: f32) -> Result<()>;
57
58 fn write_f64(&mut self, f: f64) -> Result<()>;
60
61 fn write_string(&mut self, s: &str) -> Result<()>;
63
64 fn write_binary(&mut self, data: &[u8]) -> Result<()>;
66
67 fn write_timestamp(&mut self, seconds: i64, nanoseconds: u32) -> Result<()>;
69
70 fn write_array_len(&mut self, len: usize) -> Result<()>;
72
73 fn write_map_len(&mut self, len: usize) -> Result<()>;
75
76 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 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 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 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 _ => {
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 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 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 _ => {
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 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 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 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 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 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 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 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 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 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}