1use crate::{LEN_SIZE, Rapira};
2
3#[cfg(feature = "arrayvec")]
4impl<T: crate::Rapira, const CAP: usize> crate::Rapira for arrayvec::ArrayVec<T, CAP> {
5 const MIN_SIZE: usize = LEN_SIZE;
6
7 #[inline]
8 fn size(&self) -> usize {
9 4 + match T::STATIC_SIZE {
10 Some(size) => size * self.len(),
11 None => self.iter().fold(0, |b, v| b + v.size()),
12 }
13 }
14
15 #[inline]
16 fn check_bytes(slice: &mut &[u8]) -> crate::Result<()>
17 where
18 Self: Sized,
19 {
20 let len = u32::from_slice(slice)? as usize;
21 for _ in 0..len {
22 T::check_bytes(slice)?;
23 }
24 Ok(())
25 }
26
27 #[inline]
28 fn from_slice(slice: &mut &[u8]) -> crate::Result<Self>
29 where
30 Self: Sized,
31 {
32 let len = usize::from_slice(slice)?;
33 if len > CAP {
34 return Err(crate::RapiraError::SliceLen);
35 }
36 let mut vec = Self::new_const();
37 for _ in 0..len {
38 let val = T::from_slice(slice)?;
39 vec.push(val);
40 }
41 Ok(vec)
42 }
43
44 #[inline]
45 unsafe fn from_slice_unchecked(slice: &mut &[u8]) -> crate::Result<Self>
46 where
47 Self: Sized,
48 {
49 unsafe {
50 let len = u32::from_slice_unchecked(slice)? as usize;
51 if len > CAP {
52 return Err(crate::RapiraError::SliceLen);
53 }
54 let mut vec = Self::new_const();
55 for _ in 0..len {
56 let val = T::from_slice_unchecked(slice)?;
57 vec.push_unchecked(val);
58 }
59 Ok(vec)
60 }
61 }
62
63 #[inline]
64 unsafe fn from_slice_unsafe(slice: &mut &[u8]) -> crate::Result<Self>
65 where
66 Self: Sized,
67 {
68 unsafe {
69 let len = usize::from_slice_unsafe(slice)?;
70 let mut vec = Self::new_const();
71 for _ in 0..len {
72 let val = T::from_slice_unsafe(slice)?;
73 vec.push_unchecked(val);
74 }
75
76 Ok(vec)
77 }
78 }
79
80 #[inline]
81 fn try_convert_to_bytes(&self, slice: &mut [u8], cursor: &mut usize) -> crate::Result<()> {
82 let len = self.len() as u32;
83 len.try_convert_to_bytes(slice, cursor)?;
84
85 for val in self.iter() {
86 val.try_convert_to_bytes(slice, cursor)?;
87 }
88
89 Ok(())
90 }
91
92 #[inline]
93 fn convert_to_bytes(&self, slice: &mut [u8], cursor: &mut usize) {
94 let len = self.len() as u32;
95 len.convert_to_bytes(slice, cursor);
96
97 for val in self.iter() {
98 val.convert_to_bytes(slice, cursor);
99 }
100 }
101}
102
103#[cfg(feature = "arrayvec")]
104impl<const CAP: usize> crate::Rapira for arrayvec::ArrayString<CAP> {
105 const MIN_SIZE: usize = LEN_SIZE;
106
107 #[inline]
108 fn size(&self) -> usize {
109 4 + self.len()
110 }
111
112 #[inline]
113 fn check_bytes(slice: &mut &[u8]) -> crate::Result<()>
114 where
115 Self: Sized,
116 {
117 let len = slice.len();
118 crate::str_rapira::check_bytes::<()>(core::marker::PhantomData, slice)?;
119 let size = len - slice.len();
120 if size > CAP {
121 Err(crate::RapiraError::SliceLen)
122 } else {
123 Ok(())
124 }
125 }
126
127 #[inline]
128 fn from_slice(slice: &mut &[u8]) -> crate::Result<Self>
129 where
130 Self: Sized,
131 {
132 let s = crate::str_rapira::from_slice(slice)?;
133 let s = Self::from(s).map_err(|_| crate::RapiraError::SliceLen)?;
134 Ok(s)
135 }
136
137 #[inline]
138 unsafe fn from_slice_unchecked(slice: &mut &[u8]) -> crate::Result<Self>
139 where
140 Self: Sized,
141 {
142 let s = unsafe { crate::str_rapira::from_slice_unchecked(slice)? };
143 let s = Self::from(s).map_err(|_| crate::RapiraError::SliceLen)?;
144 Ok(s)
145 }
146
147 #[inline]
148 unsafe fn from_slice_unsafe(slice: &mut &[u8]) -> crate::Result<Self>
149 where
150 Self: Sized,
151 {
152 let s = unsafe { crate::str_rapira::from_slice_unsafe(slice)? };
153 let s = Self::from(s).map_err(|_| crate::RapiraError::SliceLen)?;
154 Ok(s)
155 }
156
157 #[inline]
158 fn convert_to_bytes(&self, slice: &mut [u8], cursor: &mut usize) {
159 crate::str_rapira::convert_to_bytes(self, slice, cursor);
160 }
161
162 fn try_convert_to_bytes(&self, slice: &mut [u8], cursor: &mut usize) -> crate::Result<()> {
163 crate::str_rapira::try_convert_to_bytes(self, slice, cursor)
164 }
165}
166
167#[cfg(feature = "smallvec")]
168impl<T: crate::Rapira, const CAP: usize> crate::Rapira for smallvec::SmallVec<[T; CAP]> {
169 const MIN_SIZE: usize = LEN_SIZE;
170
171 #[inline]
172 fn size(&self) -> usize {
173 4 + match T::STATIC_SIZE {
174 Some(size) => size * self.len(),
175 None => self.iter().fold(0, |b, v| b + v.size()),
176 }
177 }
178
179 #[inline]
180 fn check_bytes(slice: &mut &[u8]) -> crate::Result<()>
181 where
182 Self: Sized,
183 {
184 let len = u32::from_slice(slice)? as usize;
185
186 for _ in 0..len {
187 T::check_bytes(slice)?;
188 }
189
190 Ok(())
191 }
192
193 #[inline]
194 fn from_slice(slice: &mut &[u8]) -> crate::Result<Self>
195 where
196 Self: Sized,
197 {
198 use crate::max_cap::{SMALLVEC_MAX_CAP, SMALLVEC_MAX_SIZE_OF};
199
200 let len = u32::from_slice(slice)? as usize;
201
202 if len > SMALLVEC_MAX_CAP {
203 return Err(crate::RapiraError::MaxCapacity);
204 }
205
206 let size = std::mem::size_of::<Self>() * len;
207
208 if size > SMALLVEC_MAX_SIZE_OF {
209 return Err(crate::RapiraError::MaxSize);
210 }
211
212 let mut vec = Self::with_capacity(len);
213
214 for _ in 0..len {
215 let val = T::from_slice(slice)?;
216 vec.push(val);
217 }
218
219 Ok(vec)
220 }
221
222 #[inline]
223 unsafe fn from_slice_unchecked(slice: &mut &[u8]) -> crate::Result<Self>
224 where
225 Self: Sized,
226 {
227 let len = u32::from_slice(slice)? as usize;
228 let mut vec = Self::with_capacity(len);
229
230 for _ in 0..len {
231 let val = unsafe { T::from_slice_unchecked(slice)? };
232 vec.push(val);
233 }
234
235 Ok(vec)
236 }
237
238 #[inline]
239 unsafe fn from_slice_unsafe(slice: &mut &[u8]) -> crate::Result<Self>
240 where
241 Self: Sized,
242 {
243 unsafe {
244 let len = usize::from_slice_unsafe(slice)?;
245 let mut vec = Self::with_capacity(len);
246
247 for _ in 0..len {
248 let val = T::from_slice_unsafe(slice)?;
249 vec.push(val);
250 }
251
252 Ok(vec)
253 }
254 }
255
256 #[inline]
257 fn try_convert_to_bytes(&self, slice: &mut [u8], cursor: &mut usize) -> crate::Result<()> {
258 let len = self.len() as u32;
259 len.try_convert_to_bytes(slice, cursor)?;
260
261 for val in self.iter() {
262 val.try_convert_to_bytes(slice, cursor)?;
263 }
264
265 Ok(())
266 }
267
268 #[inline]
269 fn convert_to_bytes(&self, slice: &mut [u8], cursor: &mut usize) {
270 let len = self.len() as u32;
271 len.convert_to_bytes(slice, cursor);
272
273 for val in self.iter() {
274 val.convert_to_bytes(slice, cursor);
275 }
276 }
277}
278
279#[cfg(feature = "bytes")]
280impl crate::Rapira for bytes::Bytes {
281 const MIN_SIZE: usize = LEN_SIZE;
282
283 #[inline]
284 fn size(&self) -> usize {
285 use crate::bytes_rapira;
286
287 bytes_rapira::size(self)
288 }
289
290 #[inline]
291 fn check_bytes(slice: &mut &[u8]) -> crate::Result<()> {
292 use crate::bytes_rapira;
293
294 bytes_rapira::check_bytes::<()>(core::marker::PhantomData, slice)
295 }
296
297 #[inline]
298 fn convert_to_bytes(&self, slice: &mut [u8], cursor: &mut usize) {
299 use crate::bytes_rapira;
300
301 bytes_rapira::convert_to_bytes(self, slice, cursor);
302 }
303
304 #[inline]
305 fn try_convert_to_bytes(&self, slice: &mut [u8], cursor: &mut usize) -> crate::Result<()> {
306 use crate::bytes_rapira;
307
308 bytes_rapira::try_convert_to_bytes(self, slice, cursor)
309 }
310
311 #[inline]
312 fn from_slice(slice: &mut &[u8]) -> crate::Result<Self>
313 where
314 Self: Sized,
315 {
316 use crate::bytes_rapira;
317
318 let bytes = bytes_rapira::from_slice(slice)?;
319 Ok(Self::copy_from_slice(bytes))
320 }
321
322 #[inline]
323 unsafe fn from_slice_unsafe(slice: &mut &[u8]) -> crate::Result<Self>
324 where
325 Self: Sized,
326 {
327 use crate::bytes_rapira;
328
329 unsafe {
330 let bytes = bytes_rapira::from_slice_unsafe(slice)?;
331 Ok(Self::copy_from_slice(bytes))
332 }
333 }
334}
335
336#[cfg(feature = "byteview")]
337impl crate::Rapira for byteview::StrView {
338 const MIN_SIZE: usize = LEN_SIZE;
339
340 #[inline]
341 fn size(&self) -> usize {
342 use crate::str_rapira;
343
344 str_rapira::size(self)
345 }
346
347 #[inline]
348 fn check_bytes(slice: &mut &[u8]) -> crate::Result<()> {
349 use crate::str_rapira;
350
351 str_rapira::check_bytes::<()>(core::marker::PhantomData, slice)
352 }
353
354 #[inline]
355 fn convert_to_bytes(&self, slice: &mut [u8], cursor: &mut usize) {
356 use crate::str_rapira;
357
358 str_rapira::convert_to_bytes(self, slice, cursor);
359 }
360
361 #[inline]
362 fn try_convert_to_bytes(&self, slice: &mut [u8], cursor: &mut usize) -> crate::Result<()> {
363 use crate::str_rapira;
364
365 str_rapira::try_convert_to_bytes(self, slice, cursor)
366 }
367
368 #[inline]
369 fn from_slice(slice: &mut &[u8]) -> crate::Result<Self>
370 where
371 Self: Sized,
372 {
373 use crate::str_rapira;
374
375 let bytes = str_rapira::from_slice(slice)?;
376 Ok(Self::from(bytes))
377 }
378
379 #[inline]
380 unsafe fn from_slice_unsafe(slice: &mut &[u8]) -> crate::Result<Self>
381 where
382 Self: Sized,
383 {
384 use crate::str_rapira;
385
386 unsafe {
387 let bytes = str_rapira::from_slice_unsafe(slice)?;
388 Ok(Self::from(bytes))
389 }
390 }
391}
392
393#[cfg(feature = "byteview")]
394impl crate::Rapira for byteview::ByteView {
395 const MIN_SIZE: usize = LEN_SIZE;
396
397 #[inline]
398 fn size(&self) -> usize {
399 use crate::bytes_rapira;
400
401 bytes_rapira::size(self)
402 }
403
404 #[inline]
405 fn check_bytes(slice: &mut &[u8]) -> crate::Result<()> {
406 use crate::bytes_rapira;
407
408 bytes_rapira::check_bytes::<()>(core::marker::PhantomData, slice)
409 }
410
411 #[inline]
412 fn convert_to_bytes(&self, slice: &mut [u8], cursor: &mut usize) {
413 use crate::bytes_rapira;
414
415 bytes_rapira::convert_to_bytes(self, slice, cursor);
416 }
417
418 #[inline]
419 fn try_convert_to_bytes(&self, slice: &mut [u8], cursor: &mut usize) -> crate::Result<()> {
420 use crate::bytes_rapira;
421
422 bytes_rapira::try_convert_to_bytes(self, slice, cursor)
423 }
424
425 #[inline]
426 fn from_slice(slice: &mut &[u8]) -> crate::Result<Self>
427 where
428 Self: Sized,
429 {
430 use crate::bytes_rapira;
431
432 let bytes = bytes_rapira::from_slice(slice)?;
433 Ok(Self::from(bytes))
434 }
435
436 #[inline]
437 unsafe fn from_slice_unsafe(slice: &mut &[u8]) -> crate::Result<Self>
438 where
439 Self: Sized,
440 {
441 use crate::bytes_rapira;
442
443 unsafe {
444 let bytes = bytes_rapira::from_slice_unsafe(slice)?;
445 Ok(Self::from(bytes))
446 }
447 }
448}
449
450#[cfg(feature = "fjall")]
451impl crate::Rapira for fjall::Slice {
452 const MIN_SIZE: usize = LEN_SIZE;
453
454 #[inline]
455 fn size(&self) -> usize {
456 use crate::bytes_rapira;
457
458 bytes_rapira::size(self)
459 }
460
461 #[inline]
462 fn check_bytes(slice: &mut &[u8]) -> crate::Result<()> {
463 use crate::bytes_rapira;
464
465 bytes_rapira::check_bytes::<()>(core::marker::PhantomData, slice)
466 }
467
468 #[inline]
469 fn convert_to_bytes(&self, slice: &mut [u8], cursor: &mut usize) {
470 use crate::bytes_rapira;
471
472 bytes_rapira::convert_to_bytes(self, slice, cursor);
473 }
474
475 #[inline]
476 fn try_convert_to_bytes(&self, slice: &mut [u8], cursor: &mut usize) -> crate::Result<()> {
477 use crate::bytes_rapira;
478
479 bytes_rapira::try_convert_to_bytes(self, slice, cursor)
480 }
481
482 #[inline]
483 fn from_slice(slice: &mut &[u8]) -> crate::Result<Self>
484 where
485 Self: Sized,
486 {
487 use crate::bytes_rapira;
488
489 let bytes = bytes_rapira::from_slice(slice)?;
490 Ok(Self::from(bytes))
491 }
492
493 #[inline]
494 unsafe fn from_slice_unsafe(slice: &mut &[u8]) -> crate::Result<Self>
495 where
496 Self: Sized,
497 {
498 use crate::bytes_rapira;
499
500 unsafe {
501 let bytes = bytes_rapira::from_slice_unsafe(slice)?;
502 Ok(Self::from(bytes))
503 }
504 }
505}
506
507#[cfg(feature = "inline-array")]
508impl crate::Rapira for inline_array::InlineArray {
509 const MIN_SIZE: usize = LEN_SIZE;
510
511 #[inline]
512 fn size(&self) -> usize {
513 use crate::bytes_rapira;
514
515 bytes_rapira::size(self)
516 }
517
518 #[inline]
519 fn check_bytes(slice: &mut &[u8]) -> crate::Result<()> {
520 use crate::bytes_rapira;
521
522 bytes_rapira::check_bytes::<()>(core::marker::PhantomData, slice)
523 }
524
525 #[inline]
526 fn convert_to_bytes(&self, slice: &mut [u8], cursor: &mut usize) {
527 use crate::bytes_rapira;
528
529 bytes_rapira::convert_to_bytes(self, slice, cursor);
530 }
531
532 #[inline]
533 fn try_convert_to_bytes(&self, slice: &mut [u8], cursor: &mut usize) -> crate::Result<()> {
534 use crate::bytes_rapira;
535
536 bytes_rapira::try_convert_to_bytes(self, slice, cursor)
537 }
538
539 #[inline]
540 fn from_slice(slice: &mut &[u8]) -> crate::Result<Self>
541 where
542 Self: Sized,
543 {
544 use crate::bytes_rapira;
545
546 let bytes = bytes_rapira::from_slice(slice)?;
547 Ok(Self::from(bytes))
548 }
549
550 #[inline]
551 unsafe fn from_slice_unsafe(slice: &mut &[u8]) -> crate::Result<Self>
552 where
553 Self: Sized,
554 {
555 use crate::bytes_rapira;
556
557 unsafe {
558 let bytes = bytes_rapira::from_slice_unsafe(slice)?;
559 Ok(Self::from(bytes))
560 }
561 }
562}
563
564#[cfg(feature = "zerocopy")]
565pub mod zero {
566 use core::{marker::PhantomData, mem::size_of};
567
568 use zerocopy::{FromBytes, Immutable, IntoBytes};
569
570 use crate::{extend, try_extend};
571
572 pub const fn static_size<T>(_: PhantomData<T>) -> Option<usize>
573 where
574 T: Sized,
575 {
576 Some(size_of::<T>())
577 }
578
579 pub const fn min_size<T>(_: PhantomData<T>) -> usize
580 where
581 T: Sized,
582 {
583 size_of::<T>()
584 }
585
586 #[inline]
587 pub fn size<T>(_: &T) -> usize
588 where
589 T: Sized,
590 {
591 size_of::<T>()
592 }
593
594 #[inline]
595 pub fn check_bytes<T>(_: PhantomData<T>, slice: &mut &[u8]) -> crate::Result<()>
596 where
597 T: Sized,
598 {
599 let size = size_of::<T>();
600
601 *slice = slice.get(size..).ok_or(crate::RapiraError::SliceLen)?;
602
603 Ok(())
604 }
605
606 #[inline]
607 pub fn from_slice<T>(slice: &mut &[u8]) -> crate::Result<T>
608 where
609 T: FromBytes + Sized,
610 {
611 let size = size_of::<T>();
612 let bytes: &[u8] = slice.get(..size).ok_or(crate::RapiraError::SliceLen)?;
613
614 *slice = slice.get(size..).ok_or(crate::RapiraError::SliceLen)?;
615
616 let t: T = FromBytes::read_from_bytes(bytes)
617 .map_err(|_| crate::RapiraError::Other("zerocopy error"))?;
618 Ok(t)
619 }
620
621 #[inline]
622 pub fn from_slice_unchecked<T>(slice: &mut &[u8]) -> crate::Result<T>
623 where
624 T: FromBytes + Sized,
625 {
626 from_slice(slice)
627 }
628
629 #[inline]
643 pub unsafe fn from_slice_unsafe<T>(slice: &mut &[u8]) -> crate::Result<T>
644 where
645 T: FromBytes + Sized,
646 {
647 unsafe {
648 let size = size_of::<T>();
649 let bytes: &[u8] = slice.get_unchecked(..size);
650 *slice = slice.get_unchecked(size..);
651 let t: T = FromBytes::read_from_bytes(bytes)
652 .map_err(|_| crate::RapiraError::Other("zerocopy error"))?;
653 Ok(t)
654 }
655 }
656
657 #[inline]
658 pub fn convert_to_bytes<T>(item: &T, slice: &mut [u8], cursor: &mut usize)
659 where
660 T: Immutable + IntoBytes + Sized,
661 {
662 let bytes = item.as_bytes();
663 extend(slice, cursor, bytes);
664 }
665
666 #[inline]
667 pub fn try_convert_to_bytes<T>(
668 item: &T,
669 slice: &mut [u8],
670 cursor: &mut usize,
671 ) -> crate::Result<()>
672 where
673 T: Immutable + IntoBytes + Sized,
674 {
675 let bytes = item.as_bytes();
676 try_extend(slice, cursor, bytes)?;
677 Ok(())
678 }
679}
680
681#[cfg(feature = "serde_json")]
682impl crate::Rapira for serde_json::Value {
683 const MIN_SIZE: usize = 1;
684
685 #[inline]
686 fn from_slice(slice: &mut &[u8]) -> crate::Result<Self>
687 where
688 Self: Sized,
689 {
690 use serde_json::{Map, Number, Value};
691
692 use crate::byte_rapira;
693
694 let byte = byte_rapira::from_slice(slice)?;
695 match byte {
696 0 => Ok(Value::Null),
697 1 => {
698 let b = bool::from_slice(slice)?;
699 Ok(Value::Bool(b))
700 }
701 2 => {
702 let byte = byte_rapira::from_slice(slice)?;
703 if byte == 0 {
704 let u = u64::from_slice(slice)?;
705 Ok(Value::Number(u.into()))
706 } else if byte == 1 {
707 let i = i64::from_slice(slice)?;
708 Ok(Value::Number(i.into()))
709 } else if byte == 2 {
710 let f = f64::from_slice(slice)?;
711 let number = Number::from_f64(f).ok_or(crate::RapiraError::FloatIsNaN)?;
712 Ok(Value::Number(number))
713 } else {
714 Err(crate::RapiraError::EnumVariant)
715 }
716 }
717 3 => {
718 let s = String::from_slice(slice)?;
719 Ok(Value::String(s))
720 }
721 4 => {
722 let vec = Vec::<Value>::from_slice(slice)?;
723 Ok(Value::Array(vec))
724 }
725 5 => {
726 let len = u32::from_slice(slice)? as usize;
727 let mut map = Map::new();
728 for _ in 0..len {
729 let key = String::from_slice(slice)?;
730 let val = Value::from_slice(slice)?;
731 map.insert(key, val);
732 }
733 Ok(Value::Object(map))
734 }
735 _ => Err(crate::RapiraError::EnumVariant),
736 }
737 }
738
739 #[inline]
740 fn check_bytes(slice: &mut &[u8]) -> crate::Result<()>
741 where
742 Self: Sized,
743 {
744 use crate::byte_rapira;
745
746 let byte = byte_rapira::from_slice(slice)?;
747 match byte {
748 0 => {}
749 1 => {
750 bool::check_bytes(slice)?;
751 }
752 2 => {
753 let byte = byte_rapira::from_slice(slice)?;
754 if byte == 0 {
755 u64::check_bytes(slice)?;
756 } else if byte == 1 {
757 i64::check_bytes(slice)?;
758 } else if byte == 2 {
759 f64::check_bytes(slice)?;
760 } else {
761 return Err(crate::RapiraError::EnumVariant);
762 }
763 }
764 3 => {
765 String::check_bytes(slice)?;
766 }
767 4 => {
768 Vec::<Self>::check_bytes(slice)?;
769 }
770 5 => {
771 let len = u32::from_slice(slice)? as usize;
772 for _ in 0..len {
773 String::check_bytes(slice)?;
774 Self::check_bytes(slice)?;
775 }
776 }
777 _ => return Err(crate::RapiraError::EnumVariant),
778 }
779
780 Ok(())
781 }
782
783 #[inline]
784 unsafe fn from_slice_unsafe(slice: &mut &[u8]) -> crate::Result<Self>
785 where
786 Self: Sized,
787 {
788 use serde_json::{Map, Number};
789
790 use crate::byte_rapira;
791
792 unsafe {
793 let byte = byte_rapira::from_slice_unsafe(slice)?;
794 match byte {
795 0 => Ok(Self::Null),
796 1 => {
797 let b = bool::from_slice_unsafe(slice)?;
798 Ok(Self::Bool(b))
799 }
800 2 => {
801 let byte = byte_rapira::from_slice_unsafe(slice)?;
802 if byte == 0 {
803 let u = u64::from_slice_unsafe(slice)?;
804 Ok(Self::Number(u.into()))
805 } else if byte == 1 {
806 let i = i64::from_slice_unsafe(slice)?;
807 Ok(Self::Number(i.into()))
808 } else if byte == 2 {
809 let f = f64::from_slice_unsafe(slice)?;
810 let number = Number::from_f64(f).ok_or(crate::RapiraError::FloatIsNaN)?;
811 Ok(Self::Number(number))
812 } else {
813 Err(crate::RapiraError::EnumVariant)
814 }
815 }
816 3 => {
817 let s = String::from_slice_unsafe(slice)?;
818 Ok(Self::String(s))
819 }
820 4 => {
821 let vec = Vec::<Self>::from_slice_unsafe(slice)?;
822 Ok(Self::Array(vec))
823 }
824 5 => {
825 let len = usize::from_slice_unsafe(slice)?;
826 let mut map = Map::new();
827 for _ in 0..len {
828 let key = String::from_slice_unsafe(slice)?;
829 let val = Self::from_slice_unsafe(slice)?;
830 map.insert(key, val);
831 }
832 Ok(Self::Object(map))
833 }
834 _ => Err(crate::RapiraError::EnumVariant),
835 }
836 }
837 }
838
839 #[inline]
840 fn convert_to_bytes(&self, slice: &mut [u8], cursor: &mut usize) {
841 use crate::push;
842
843 match self {
844 Self::Null => {
845 push(slice, cursor, 0);
846 }
847 Self::Bool(v) => {
848 push(slice, cursor, 1);
849 v.convert_to_bytes(slice, cursor);
850 }
851 Self::Number(n) => {
852 push(slice, cursor, 2);
853 if let Some(u) = n.as_u64() {
854 push(slice, cursor, 0);
855 u.convert_to_bytes(slice, cursor);
856 } else if let Some(i) = n.as_i64() {
857 push(slice, cursor, 1);
858 i.convert_to_bytes(slice, cursor);
859 } else if let Some(f) = n.as_f64() {
860 push(slice, cursor, 2);
861 f.convert_to_bytes(slice, cursor);
862 }
863 }
864 Self::String(s) => {
865 push(slice, cursor, 3);
866 s.convert_to_bytes(slice, cursor);
867 }
868 Self::Array(a) => {
869 push(slice, cursor, 4);
870 a.convert_to_bytes(slice, cursor);
871 }
872 Self::Object(o) => {
873 push(slice, cursor, 5);
874 let size: u32 = o.len() as u32;
875 size.convert_to_bytes(slice, cursor);
876 o.iter().for_each(|(k, v)| {
877 k.convert_to_bytes(slice, cursor);
878 v.convert_to_bytes(slice, cursor);
879 });
880 }
881 }
882 }
883
884 #[inline]
885 fn try_convert_to_bytes(&self, slice: &mut [u8], cursor: &mut usize) -> crate::Result<()> {
886 use crate::try_push;
887
888 match self {
889 Self::Null => {
890 try_push(slice, cursor, 0)?;
891 }
892 Self::Bool(v) => {
893 try_push(slice, cursor, 1)?;
894 v.convert_to_bytes(slice, cursor);
895 }
896 Self::Number(n) => {
897 try_push(slice, cursor, 2)?;
898 if let Some(u) = n.as_u64() {
899 try_push(slice, cursor, 0)?;
900 u.try_convert_to_bytes(slice, cursor)?;
901 } else if let Some(i) = n.as_i64() {
902 try_push(slice, cursor, 1)?;
903 i.try_convert_to_bytes(slice, cursor)?;
904 } else if let Some(f) = n.as_f64() {
905 try_push(slice, cursor, 2)?;
906 f.try_convert_to_bytes(slice, cursor)?;
907 }
908 }
909 Self::String(s) => {
910 try_push(slice, cursor, 3)?;
911 s.try_convert_to_bytes(slice, cursor)?;
912 }
913 Self::Array(a) => {
914 try_push(slice, cursor, 4)?;
915 a.try_convert_to_bytes(slice, cursor)?;
916 }
917 Self::Object(o) => {
918 try_push(slice, cursor, 5)?;
919 let size: u32 = o.len() as u32;
920 size.try_convert_to_bytes(slice, cursor)?;
921 for (k, v) in o.iter() {
922 k.try_convert_to_bytes(slice, cursor)?;
923 v.try_convert_to_bytes(slice, cursor)?;
924 }
925 }
926 }
927 Ok(())
928 }
929
930 #[inline]
931 fn size(&self) -> usize {
932 1 + match self {
933 Self::Null => 0,
934 Self::Bool(_) => 1,
935 Self::Number(_) => 1 + 8,
936 Self::String(s) => s.size(),
937 Self::Array(vec) => 4 + vec.iter().fold(0, |acc, item| acc + item.size()),
938 Self::Object(v) => {
939 4 + v
940 .iter()
941 .fold(0, |acc, item| acc + item.0.size() + item.1.size())
942 }
943 }
944 }
945}
946
947#[cfg(feature = "rust_decimal")]
948impl crate::Rapira for rust_decimal::Decimal {
949 const STATIC_SIZE: Option<usize> = Some(16);
950 const MIN_SIZE: usize = 16;
951
952 unsafe fn from_slice_unsafe(slice: &mut &[u8]) -> crate::Result<Self>
953 where
954 Self: Sized,
955 {
956 unsafe {
957 let bytes = <[u8; 16]>::from_slice_unsafe(slice)?;
958 Ok(Self::deserialize(bytes))
959 }
960 }
961
962 fn from_slice(slice: &mut &[u8]) -> crate::Result<Self>
963 where
964 Self: Sized,
965 {
966 let bytes = <[u8; 16]>::from_slice(slice)?;
967 Ok(Self::deserialize(bytes))
968 }
969
970 fn check_bytes(_: &mut &[u8]) -> crate::Result<()> {
971 Ok(())
972 }
973
974 fn convert_to_bytes(&self, slice: &mut [u8], cursor: &mut usize) {
975 self.serialize().convert_to_bytes(slice, cursor);
976 }
977
978 fn try_convert_to_bytes(&self, slice: &mut [u8], cursor: &mut usize) -> crate::Result<()> {
979 self.serialize().try_convert_to_bytes(slice, cursor)
980 }
981
982 fn size(&self) -> usize {
983 16
984 }
985}
986
987#[cfg(feature = "compact_str")]
988impl crate::Rapira for compact_str::CompactString {
989 const MIN_SIZE: usize = LEN_SIZE;
990
991 fn size(&self) -> usize {
992 4 + self.len()
993 }
994
995 fn check_bytes(slice: &mut &[u8]) -> crate::Result<()> {
996 crate::str_rapira::check_bytes::<()>(core::marker::PhantomData, slice)
997 }
998
999 fn from_slice(slice: &mut &[u8]) -> crate::Result<Self>
1000 where
1001 Self: Sized,
1002 {
1003 let s = crate::str_rapira::from_slice(slice)?;
1004 let s = Self::new(s);
1005 Ok(s)
1006 }
1007
1008 unsafe fn from_slice_unsafe(slice: &mut &[u8]) -> crate::Result<Self>
1009 where
1010 Self: Sized,
1011 {
1012 unsafe {
1013 let s = crate::str_rapira::from_slice_unsafe(slice)?;
1014 let s = Self::new(s);
1015 Ok(s)
1016 }
1017 }
1018
1019 unsafe fn from_slice_unchecked(slice: &mut &[u8]) -> crate::Result<Self>
1020 where
1021 Self: Sized,
1022 {
1023 unsafe {
1024 let s = crate::str_rapira::from_slice_unchecked(slice)?;
1025 let s = Self::new(s);
1026 Ok(s)
1027 }
1028 }
1029
1030 fn convert_to_bytes(&self, slice: &mut [u8], cursor: &mut usize) {
1031 crate::str_rapira::convert_to_bytes(self, slice, cursor);
1032 }
1033
1034 fn try_convert_to_bytes(&self, slice: &mut [u8], cursor: &mut usize) -> crate::Result<()> {
1035 crate::str_rapira::try_convert_to_bytes(self, slice, cursor)
1036 }
1037}
1038
1039#[cfg(feature = "ecow")]
1040impl crate::Rapira for ecow::EcoString {
1041 const MIN_SIZE: usize = LEN_SIZE;
1042
1043 fn size(&self) -> usize {
1044 4 + self.len()
1045 }
1046
1047 fn check_bytes(slice: &mut &[u8]) -> crate::Result<()> {
1048 crate::str_rapira::check_bytes::<()>(core::marker::PhantomData, slice)
1049 }
1050
1051 fn from_slice(slice: &mut &[u8]) -> crate::Result<Self>
1052 where
1053 Self: Sized,
1054 {
1055 let s = crate::str_rapira::from_slice(slice)?;
1056 let s = Self::from(s);
1057 Ok(s)
1058 }
1059
1060 unsafe fn from_slice_unsafe(slice: &mut &[u8]) -> crate::Result<Self>
1061 where
1062 Self: Sized,
1063 {
1064 unsafe {
1065 let s = crate::str_rapira::from_slice_unsafe(slice)?;
1066 let s = Self::from(s);
1067 Ok(s)
1068 }
1069 }
1070
1071 unsafe fn from_slice_unchecked(slice: &mut &[u8]) -> crate::Result<Self>
1072 where
1073 Self: Sized,
1074 {
1075 unsafe {
1076 let s = crate::str_rapira::from_slice_unchecked(slice)?;
1077 let s = Self::from(s);
1078 Ok(s)
1079 }
1080 }
1081
1082 fn convert_to_bytes(&self, slice: &mut [u8], cursor: &mut usize) {
1083 crate::str_rapira::convert_to_bytes(self, slice, cursor);
1084 }
1085
1086 fn try_convert_to_bytes(&self, slice: &mut [u8], cursor: &mut usize) -> crate::Result<()> {
1087 crate::str_rapira::try_convert_to_bytes(self, slice, cursor)
1088 }
1089}
1090
1091#[cfg(feature = "ecow")]
1092impl<T> crate::Rapira for ecow::EcoVec<T>
1093where
1094 T: crate::Rapira + Clone,
1095{
1096 const MIN_SIZE: usize = LEN_SIZE;
1097
1098 #[inline]
1099 fn size(&self) -> usize {
1100 4 + match T::STATIC_SIZE {
1101 Some(size) => size * self.len(),
1102 None => self.iter().fold(0, |b, v| b + v.size()),
1103 }
1104 }
1105
1106 #[inline]
1107 fn check_bytes(slice: &mut &[u8]) -> crate::Result<()>
1108 where
1109 Self: Sized,
1110 {
1111 let len = u32::from_slice(slice)? as usize;
1112
1113 for _ in 0..len {
1114 T::check_bytes(slice)?;
1115 }
1116
1117 Ok(())
1118 }
1119
1120 #[inline]
1121 fn from_slice(slice: &mut &[u8]) -> crate::Result<Self>
1122 where
1123 Self: Sized,
1124 {
1125 use crate::max_cap::{SMALLVEC_MAX_CAP, SMALLVEC_MAX_SIZE_OF};
1126
1127 let len = u32::from_slice(slice)? as usize;
1128
1129 if len > SMALLVEC_MAX_CAP {
1130 return Err(crate::RapiraError::MaxCapacity);
1131 }
1132
1133 let size = std::mem::size_of::<Self>() * len;
1134
1135 if size > SMALLVEC_MAX_SIZE_OF {
1136 return Err(crate::RapiraError::MaxSize);
1137 }
1138
1139 let mut vec = Self::with_capacity(len);
1140
1141 for _ in 0..len {
1142 let val = T::from_slice(slice)?;
1143 vec.push(val);
1144 }
1145
1146 Ok(vec)
1147 }
1148
1149 #[inline]
1150 unsafe fn from_slice_unchecked(slice: &mut &[u8]) -> crate::Result<Self>
1151 where
1152 Self: Sized,
1153 {
1154 let len = u32::from_slice(slice)? as usize;
1155 let mut vec = Self::with_capacity(len);
1156
1157 for _ in 0..len {
1158 let val = unsafe { T::from_slice_unchecked(slice)? };
1159 vec.push(val);
1160 }
1161
1162 Ok(vec)
1163 }
1164
1165 #[inline]
1166 unsafe fn from_slice_unsafe(slice: &mut &[u8]) -> crate::Result<Self>
1167 where
1168 Self: Sized,
1169 {
1170 unsafe {
1171 let len = usize::from_slice_unsafe(slice)?;
1172 let mut vec = Self::with_capacity(len);
1173
1174 let iter = core::iter::repeat_with(|| T::from_slice_unsafe(slice)).take(len);
1175
1176 for item in iter {
1177 let val = item?;
1178 vec.push(val);
1179 }
1180
1181 Ok(vec)
1182 }
1183 }
1184
1185 #[inline]
1186 fn try_convert_to_bytes(&self, slice: &mut [u8], cursor: &mut usize) -> crate::Result<()> {
1187 let len = self.len() as u32;
1188 len.try_convert_to_bytes(slice, cursor)?;
1189
1190 for val in self.iter() {
1191 val.try_convert_to_bytes(slice, cursor)?;
1192 }
1193
1194 Ok(())
1195 }
1196
1197 #[inline]
1198 fn convert_to_bytes(&self, slice: &mut [u8], cursor: &mut usize) {
1199 let len = self.len() as u32;
1200 len.convert_to_bytes(slice, cursor);
1201
1202 for val in self.iter() {
1203 val.convert_to_bytes(slice, cursor);
1204 }
1205 }
1206}
1207
1208#[cfg(feature = "indexmap")]
1209impl<K: crate::Rapira, V: crate::Rapira, S> crate::Rapira
1210 for indexmap::IndexMap<K, V, core::hash::BuildHasherDefault<S>>
1211where
1212 K: Eq + core::hash::Hash,
1213 S: core::hash::Hasher + core::default::Default,
1214{
1215 const MIN_SIZE: usize = LEN_SIZE;
1216
1217 #[inline]
1218 fn size(&self) -> usize {
1219 if let Some(k) = K::STATIC_SIZE {
1220 if let Some(v) = V::STATIC_SIZE {
1221 4 + (self.len() * (k + v))
1222 } else {
1223 4 + (k * self.len()) + self.iter().fold(0, |b, (_, v)| b + v.size())
1224 }
1225 } else {
1226 4 + self.iter().fold(0, |b, (k, v)| {
1227 b + k.size() + V::STATIC_SIZE.unwrap_or_else(|| v.size())
1228 })
1229 }
1230 }
1231
1232 #[inline]
1233 fn check_bytes(slice: &mut &[u8]) -> crate::Result<()>
1234 where
1235 Self: Sized,
1236 {
1237 let len = u32::from_slice(slice)? as usize;
1238 for _ in 0..len {
1239 K::check_bytes(slice)?;
1240 V::check_bytes(slice)?;
1241 }
1242 Ok(())
1243 }
1244
1245 #[inline]
1246 fn from_slice(slice: &mut &[u8]) -> crate::Result<Self>
1247 where
1248 Self: Sized,
1249 {
1250 use crate::max_cap::{VEC_MAX_CAP, VEC_MAX_SIZE_OF};
1251
1252 let len = u32::from_slice(slice)? as usize;
1253
1254 if len > VEC_MAX_CAP {
1255 return Err(crate::RapiraError::MaxCapacity);
1256 }
1257
1258 let size = std::mem::size_of::<Self>() * len;
1259
1260 if size > VEC_MAX_SIZE_OF {
1261 return Err(crate::RapiraError::MaxSize);
1262 }
1263
1264 let mut map = Self::with_capacity_and_hasher(len, Default::default());
1265 for _ in 0..len {
1266 let key = K::from_slice(slice)?;
1267 let value = V::from_slice(slice)?;
1268 map.insert(key, value);
1269 }
1270 Ok(map)
1271 }
1272
1273 #[inline]
1274 unsafe fn from_slice_unchecked(slice: &mut &[u8]) -> crate::Result<Self>
1275 where
1276 Self: Sized,
1277 {
1278 let len = u32::from_slice(slice)? as usize;
1279 let mut map = Self::with_capacity_and_hasher(len, Default::default());
1280 for _ in 0..len {
1281 unsafe {
1282 let key = K::from_slice_unchecked(slice)?;
1283 let value = V::from_slice_unchecked(slice)?;
1284 map.insert(key, value);
1285 }
1286 }
1287 Ok(map)
1288 }
1289
1290 #[inline]
1291 unsafe fn from_slice_unsafe(slice: &mut &[u8]) -> crate::Result<Self>
1292 where
1293 Self: Sized,
1294 {
1295 unsafe {
1296 let len = u32::from_slice_unsafe(slice)? as usize;
1297 let mut map = Self::with_capacity_and_hasher(len, Default::default());
1298 for _ in 0..len {
1299 let key = K::from_slice_unsafe(slice)?;
1300 let value = V::from_slice_unsafe(slice)?;
1301 map.insert(key, value);
1302 }
1303 Ok(map)
1304 }
1305 }
1306
1307 #[inline]
1308 fn try_convert_to_bytes(&self, slice: &mut [u8], cursor: &mut usize) -> crate::Result<()> {
1309 let len = self.len() as u32;
1310 len.try_convert_to_bytes(slice, cursor)?;
1311 for (key, value) in self {
1312 key.try_convert_to_bytes(slice, cursor)?;
1313 value.try_convert_to_bytes(slice, cursor)?;
1314 }
1315 Ok(())
1316 }
1317
1318 #[inline]
1319 fn convert_to_bytes(&self, slice: &mut [u8], cursor: &mut usize) {
1320 let len = self.len() as u32;
1321 len.convert_to_bytes(slice, cursor);
1322 for (key, value) in self {
1323 key.convert_to_bytes(slice, cursor);
1324 value.convert_to_bytes(slice, cursor);
1325 }
1326 }
1327}
1328
1329#[cfg(feature = "uuid")]
1330impl crate::Rapira for uuid::Uuid {
1331 const STATIC_SIZE: Option<usize> = Some(16);
1332 const MIN_SIZE: usize = 16;
1333
1334 fn size(&self) -> usize {
1335 16
1336 }
1337
1338 fn check_bytes(slice: &mut &[u8]) -> crate::Result<()> {
1339 <[u8; 16]>::check_bytes(slice)
1340 }
1341
1342 fn from_slice(slice: &mut &[u8]) -> crate::Result<Self>
1343 where
1344 Self: Sized,
1345 {
1346 let bytes = uuid::Bytes::from_slice(slice)?;
1347 Ok(Self::from_bytes(bytes))
1348 }
1349
1350 unsafe fn from_slice_unsafe(slice: &mut &[u8]) -> crate::Result<Self>
1351 where
1352 Self: Sized,
1353 {
1354 unsafe {
1355 let bytes = <[u8; 16]>::from_slice_unsafe(slice)?;
1356 Ok(Self::from_bytes(bytes))
1357 }
1358 }
1359
1360 fn convert_to_bytes(&self, slice: &mut [u8], cursor: &mut usize) {
1361 let bytes = self.as_bytes();
1362 bytes.convert_to_bytes(slice, cursor);
1363 }
1364
1365 fn try_convert_to_bytes(&self, slice: &mut [u8], cursor: &mut usize) -> crate::Result<()> {
1366 let bytes = self.as_bytes();
1367 bytes.try_convert_to_bytes(slice, cursor)
1368 }
1369}
1370
1371#[cfg(feature = "time")]
1372impl Rapira for time::Date {
1373 const STATIC_SIZE: Option<usize> = Some(4);
1374 const MIN_SIZE: usize = 4;
1375
1376 fn size(&self) -> usize {
1377 4
1378 }
1379
1380 fn check_bytes(slice: &mut &[u8]) -> crate::Result<()> {
1381 let val = i32::from_slice(slice)?;
1382 Self::from_julian_day(val).map_err(|_| crate::RapiraError::Datetime)?;
1383 Ok(())
1384 }
1385
1386 fn from_slice(slice: &mut &[u8]) -> crate::Result<Self>
1387 where
1388 Self: Sized,
1389 {
1390 let julian_day = i32::from_slice(slice)?;
1391 Self::from_julian_day(julian_day).map_err(|_| crate::RapiraError::Datetime)
1392 }
1393
1394 fn convert_to_bytes(&self, slice: &mut [u8], cursor: &mut usize) {
1395 self.to_julian_day().convert_to_bytes(slice, cursor);
1396 }
1397}