1use std::cmp;
8use std::convert::Infallible as Never;
9use std::fmt::{self, Debug, Formatter};
10use std::marker::PhantomData;
11use std::ops::{Range, RangeBounds};
12
13use arrayvec::ArrayVec;
14use zerocopy::SplitByteSlice;
15
16use crate::{
17 AsFragmentedByteSlice, Buffer, BufferView, BufferViewMut, ContiguousBuffer, EmptyBuf,
18 FragmentedBuffer, FragmentedBufferMut, FragmentedBytes, FragmentedBytesMut, GrowBuffer,
19 GrowBufferMut, ParsablePacket, ParseBuffer, ParseBufferMut, ReusableBuffer, ShrinkBuffer,
20 canonicalize_range,
21};
22
23#[derive(Copy, Clone, Debug)]
29pub enum Either<A, B> {
30 A(A),
31 B(B),
32}
33
34impl<A, B> Either<A, B> {
35 pub fn map_a<AA, F: FnOnce(A) -> AA>(self, f: F) -> Either<AA, B> {
41 match self {
42 Either::A(a) => Either::A(f(a)),
43 Either::B(b) => Either::B(b),
44 }
45 }
46
47 pub fn map_b<BB, F: FnOnce(B) -> BB>(self, f: F) -> Either<A, BB> {
53 match self {
54 Either::A(a) => Either::A(a),
55 Either::B(b) => Either::B(f(b)),
56 }
57 }
58
59 pub fn unwrap_a(self) -> A {
65 match self {
66 Either::A(x) => x,
67 Either::B(_) => panic!("This `Either<A, B>` does not hold the `A` variant"),
68 }
69 }
70
71 pub fn unwrap_b(self) -> B {
77 match self {
78 Either::A(_) => panic!("This `Either<A, B>` does not hold the `B` variant"),
79 Either::B(x) => x,
80 }
81 }
82}
83
84impl<A> Either<A, A> {
85 pub fn into_inner(self) -> A {
88 match self {
89 Either::A(x) => x,
90 Either::B(x) => x,
91 }
92 }
93}
94
95impl<A> Either<A, Never> {
96 #[inline]
98 pub fn into_a(self) -> A {
99 match self {
100 Either::A(a) => a,
101 }
102 }
103}
104
105impl<B> Either<Never, B> {
106 #[inline]
108 pub fn into_b(self) -> B {
109 match self {
110 Either::B(b) => b,
111 }
112 }
113}
114
115macro_rules! call_method_on_either {
116 ($val:expr, $method:ident, $($args:expr),*) => {
117 match $val {
118 Either::A(a) => a.$method($($args),*),
119 Either::B(b) => b.$method($($args),*),
120 }
121 };
122 ($val:expr, $method:ident) => {
123 call_method_on_either!($val, $method,)
124 };
125}
126
127impl<A, B> FragmentedBuffer for Either<A, B>
134where
135 A: FragmentedBuffer,
136 B: FragmentedBuffer,
137{
138 fn len(&self) -> usize {
139 call_method_on_either!(self, len)
140 }
141
142 fn with_bytes<'a, R, F>(&'a self, f: F) -> R
143 where
144 F: for<'b> FnOnce(FragmentedBytes<'b, 'a>) -> R,
145 {
146 call_method_on_either!(self, with_bytes, f)
147 }
148}
149
150impl<A, B> ContiguousBuffer for Either<A, B>
151where
152 A: ContiguousBuffer,
153 B: ContiguousBuffer,
154{
155}
156
157impl<A, B> ShrinkBuffer for Either<A, B>
158where
159 A: ShrinkBuffer,
160 B: ShrinkBuffer,
161{
162 fn shrink<R: RangeBounds<usize>>(&mut self, range: R) {
163 call_method_on_either!(self, shrink, range)
164 }
165 fn shrink_front(&mut self, n: usize) {
166 call_method_on_either!(self, shrink_front, n)
167 }
168 fn shrink_back(&mut self, n: usize) {
169 call_method_on_either!(self, shrink_back, n)
170 }
171}
172
173impl<A, B> ParseBuffer for Either<A, B>
174where
175 A: ParseBuffer,
176 B: ParseBuffer,
177{
178 fn parse<'a, P: ParsablePacket<&'a [u8], ()>>(&'a mut self) -> Result<P, P::Error> {
179 call_method_on_either!(self, parse)
180 }
181 fn parse_with<'a, ParseArgs, P: ParsablePacket<&'a [u8], ParseArgs>>(
182 &'a mut self,
183 args: ParseArgs,
184 ) -> Result<P, P::Error> {
185 call_method_on_either!(self, parse_with, args)
186 }
187}
188
189impl<A, B> FragmentedBufferMut for Either<A, B>
190where
191 A: FragmentedBufferMut,
192 B: FragmentedBufferMut,
193{
194 fn with_bytes_mut<'a, R, F>(&'a mut self, f: F) -> R
195 where
196 F: for<'b> FnOnce(FragmentedBytesMut<'b, 'a>) -> R,
197 {
198 call_method_on_either!(self, with_bytes_mut, f)
199 }
200}
201
202impl<A, B> ParseBufferMut for Either<A, B>
203where
204 A: ParseBufferMut,
205 B: ParseBufferMut,
206{
207 fn parse_mut<'a, P: ParsablePacket<&'a mut [u8], ()>>(&'a mut self) -> Result<P, P::Error> {
208 call_method_on_either!(self, parse_mut)
209 }
210 fn parse_with_mut<'a, ParseArgs, P: ParsablePacket<&'a mut [u8], ParseArgs>>(
211 &'a mut self,
212 args: ParseArgs,
213 ) -> Result<P, P::Error> {
214 call_method_on_either!(self, parse_with_mut, args)
215 }
216}
217
218impl<A, B> GrowBuffer for Either<A, B>
219where
220 A: GrowBuffer,
221 B: GrowBuffer,
222{
223 #[inline]
224 fn with_parts<'a, O, F>(&'a self, f: F) -> O
225 where
226 F: for<'b> FnOnce(&'a [u8], FragmentedBytes<'b, 'a>, &'a [u8]) -> O,
227 {
228 call_method_on_either!(self, with_parts, f)
229 }
230 fn capacity(&self) -> usize {
231 call_method_on_either!(self, capacity)
232 }
233 fn prefix_len(&self) -> usize {
234 call_method_on_either!(self, prefix_len)
235 }
236 fn suffix_len(&self) -> usize {
237 call_method_on_either!(self, suffix_len)
238 }
239 fn grow_front(&mut self, n: usize) {
240 call_method_on_either!(self, grow_front, n)
241 }
242 fn grow_back(&mut self, n: usize) {
243 call_method_on_either!(self, grow_back, n)
244 }
245 fn reset(&mut self) {
246 call_method_on_either!(self, reset)
247 }
248}
249
250impl<A, B> GrowBufferMut for Either<A, B>
251where
252 A: GrowBufferMut,
253 B: GrowBufferMut,
254{
255 fn with_parts_mut<'a, O, F>(&'a mut self, f: F) -> O
256 where
257 F: for<'b> FnOnce(&'a mut [u8], FragmentedBytesMut<'b, 'a>, &'a mut [u8]) -> O,
258 {
259 call_method_on_either!(self, with_parts_mut, f)
260 }
261
262 fn with_all_contents_mut<'a, O, F>(&'a mut self, f: F) -> O
263 where
264 F: for<'b> FnOnce(FragmentedBytesMut<'b, 'a>) -> O,
265 {
266 call_method_on_either!(self, with_all_contents_mut, f)
267 }
268
269 fn serialize<C: SerializationContext, BB: PacketBuilder<C>>(
270 &mut self,
271 context: &mut C,
272 builder: BB,
273 ) {
274 call_method_on_either!(self, serialize, context, builder)
275 }
276}
277
278impl<A, B> Buffer for Either<A, B>
279where
280 A: Buffer,
281 B: Buffer,
282{
283 fn parse_with_view<'a, ParseArgs, P: ParsablePacket<&'a [u8], ParseArgs>>(
284 &'a mut self,
285 args: ParseArgs,
286 ) -> Result<(P, &'a [u8]), P::Error> {
287 call_method_on_either!(self, parse_with_view, args)
288 }
289}
290
291impl<A: AsRef<[u8]>, B: AsRef<[u8]>> AsRef<[u8]> for Either<A, B> {
292 fn as_ref(&self) -> &[u8] {
293 call_method_on_either!(self, as_ref)
294 }
295}
296
297impl<A: AsMut<[u8]>, B: AsMut<[u8]>> AsMut<[u8]> for Either<A, B> {
298 fn as_mut(&mut self) -> &mut [u8] {
299 call_method_on_either!(self, as_mut)
300 }
301}
302
303#[derive(Clone, Debug)]
309pub struct Buf<B> {
310 buf: B,
311 body: Range<usize>,
312}
313
314impl<B: AsRef<[u8]>> PartialEq for Buf<B> {
315 fn eq(&self, other: &Self) -> bool {
316 let self_slice = AsRef::<[u8]>::as_ref(self);
317 let other_slice = AsRef::<[u8]>::as_ref(other);
318 PartialEq::eq(self_slice, other_slice)
319 }
320}
321
322impl<B: AsRef<[u8]>> Eq for Buf<B> {}
323
324impl Buf<Vec<u8>> {
325 pub fn into_inner(self) -> Vec<u8> {
327 let Buf { mut buf, body } = self;
328 let len = body.end - body.start;
329 let _ = buf.drain(..body.start);
330 buf.truncate(len);
331 buf
332 }
333}
334
335impl<B> Buf<B> {
336 pub fn into_parts(self) -> (B, Range<usize>) {
338 let Buf { buf, body } = self;
339 (buf, body)
340 }
341}
342
343impl<B: AsRef<[u8]>> Buf<B> {
344 pub fn new<R: RangeBounds<usize>>(buf: B, body: R) -> Buf<B> {
355 let len = buf.as_ref().len();
356 Buf { buf, body: canonicalize_range(len, &body) }
357 }
358
359 pub fn buffer_view(&mut self) -> BufView<'_> {
361 BufView { buf: &self.buf.as_ref()[self.body.clone()], body: &mut self.body }
362 }
363}
364
365impl<B: AsRef<[u8]> + AsMut<[u8]>> Buf<B> {
366 pub fn buffer_view_mut(&mut self) -> BufViewMut<'_> {
368 BufViewMut { buf: &mut self.buf.as_mut()[self.body.clone()], body: &mut self.body }
369 }
370}
371
372impl<B: AsRef<[u8]>> FragmentedBuffer for Buf<B> {
373 fragmented_buffer_method_impls!();
374}
375impl<B: AsRef<[u8]>> ContiguousBuffer for Buf<B> {}
376impl<B: AsRef<[u8]>> ShrinkBuffer for Buf<B> {
377 fn shrink<R: RangeBounds<usize>>(&mut self, range: R) {
378 let len = self.len();
379 let mut range = canonicalize_range(len, &range);
380 range.start += self.body.start;
381 range.end += self.body.start;
382 self.body = range;
383 }
384
385 fn shrink_front(&mut self, n: usize) {
386 assert!(n <= self.len());
387 self.body.start += n;
388 }
389 fn shrink_back(&mut self, n: usize) {
390 assert!(n <= self.len());
391 self.body.end -= n;
392 }
393}
394impl<B: AsRef<[u8]>> ParseBuffer for Buf<B> {
395 fn parse_with<'a, ParseArgs, P: ParsablePacket<&'a [u8], ParseArgs>>(
396 &'a mut self,
397 args: ParseArgs,
398 ) -> Result<P, P::Error> {
399 P::parse(self.buffer_view(), args)
400 }
401}
402
403impl<B: AsRef<[u8]> + AsMut<[u8]>> FragmentedBufferMut for Buf<B> {
404 fragmented_buffer_mut_method_impls!();
405}
406
407impl<B: AsRef<[u8]> + AsMut<[u8]>> ParseBufferMut for Buf<B> {
408 fn parse_with_mut<'a, ParseArgs, P: ParsablePacket<&'a mut [u8], ParseArgs>>(
409 &'a mut self,
410 args: ParseArgs,
411 ) -> Result<P, P::Error> {
412 P::parse_mut(self.buffer_view_mut(), args)
413 }
414}
415
416impl<B: AsRef<[u8]>> GrowBuffer for Buf<B> {
417 fn with_parts<'a, O, F>(&'a self, f: F) -> O
418 where
419 F: for<'b> FnOnce(&'a [u8], FragmentedBytes<'b, 'a>, &'a [u8]) -> O,
420 {
421 let (prefix, buf) = self.buf.as_ref().split_at(self.body.start);
422 let (body, suffix) = buf.split_at(self.body.end - self.body.start);
423 let mut body = [&body[..]];
424 f(prefix, body.as_fragmented_byte_slice(), suffix)
425 }
426 fn capacity(&self) -> usize {
427 self.buf.as_ref().len()
428 }
429 fn prefix_len(&self) -> usize {
430 self.body.start
431 }
432 fn suffix_len(&self) -> usize {
433 self.buf.as_ref().len() - self.body.end
434 }
435 fn grow_front(&mut self, n: usize) {
436 assert!(n <= self.body.start);
437 self.body.start -= n;
438 }
439 fn grow_back(&mut self, n: usize) {
440 assert!(n <= self.buf.as_ref().len() - self.body.end);
441 self.body.end += n;
442 }
443}
444
445impl<B: AsRef<[u8]> + AsMut<[u8]>> GrowBufferMut for Buf<B> {
446 fn with_parts_mut<'a, O, F>(&'a mut self, f: F) -> O
447 where
448 F: for<'b> FnOnce(&'a mut [u8], FragmentedBytesMut<'b, 'a>, &'a mut [u8]) -> O,
449 {
450 let (prefix, buf) = self.buf.as_mut().split_at_mut(self.body.start);
451 let (body, suffix) = buf.split_at_mut(self.body.end - self.body.start);
452 let mut body = [&mut body[..]];
453 f(prefix, body.as_fragmented_byte_slice(), suffix)
454 }
455
456 fn with_all_contents_mut<'a, O, F>(&'a mut self, f: F) -> O
457 where
458 F: for<'b> FnOnce(FragmentedBytesMut<'b, 'a>) -> O,
459 {
460 let mut all = [self.buf.as_mut()];
461 f(all.as_fragmented_byte_slice())
462 }
463}
464
465impl<B: AsRef<[u8]>> AsRef<[u8]> for Buf<B> {
466 fn as_ref(&self) -> &[u8] {
467 &self.buf.as_ref()[self.body.clone()]
468 }
469}
470
471impl<B: AsMut<[u8]>> AsMut<[u8]> for Buf<B> {
472 fn as_mut(&mut self) -> &mut [u8] {
473 &mut self.buf.as_mut()[self.body.clone()]
474 }
475}
476
477impl<B: AsRef<[u8]>> Buffer for Buf<B> {
478 fn parse_with_view<'a, ParseArgs, P: ParsablePacket<&'a [u8], ParseArgs>>(
479 &'a mut self,
480 args: ParseArgs,
481 ) -> Result<(P, &'a [u8]), P::Error> {
482 let &mut Self { ref mut body, ref buf } = self;
483 let body_before = body.clone();
484 let view = BufView { buf: &buf.as_ref()[body.clone()], body };
485 P::parse(view, args).map(|r| (r, &buf.as_ref()[body_before]))
486 }
487}
488
489pub struct BufView<'a> {
494 buf: &'a [u8],
495 body: &'a mut Range<usize>,
496}
497
498impl<'a> BufferView<&'a [u8]> for BufView<'a> {
499 fn take_front(&mut self, n: usize) -> Option<&'a [u8]> {
500 if self.len() < n {
501 return None;
502 }
503 self.body.start += n;
504 self.buf.split_off(..n)
505 }
506
507 fn take_back(&mut self, n: usize) -> Option<&'a [u8]> {
508 if self.len() < n {
509 return None;
510 }
511 self.body.end -= n;
512
513 let split = <[u8]>::len(self.buf).checked_sub(n).unwrap();
514 self.buf.split_off(split..)
515 }
516
517 fn into_rest(self) -> &'a [u8] {
518 self.buf
519 }
520}
521
522impl<'a> AsRef<[u8]> for BufView<'a> {
523 fn as_ref(&self) -> &[u8] {
524 self.buf
525 }
526}
527
528pub struct BufViewMut<'a> {
534 buf: &'a mut [u8],
535 body: &'a mut Range<usize>,
536}
537
538impl<'a> BufferView<&'a mut [u8]> for BufViewMut<'a> {
539 fn take_front(&mut self, n: usize) -> Option<&'a mut [u8]> {
540 if self.len() < n {
541 return None;
542 }
543 self.body.start += n;
544 self.buf.split_off_mut(..n)
545 }
546
547 fn take_back(&mut self, n: usize) -> Option<&'a mut [u8]> {
548 if self.len() < n {
549 return None;
550 }
551 self.body.end -= n;
552
553 let split = <[u8]>::len(self.buf).checked_sub(n)?;
554 Some(self.buf.split_off_mut(split..)?)
555 }
556
557 fn into_rest(self) -> &'a mut [u8] {
558 self.buf
559 }
560}
561
562impl<'a> BufferViewMut<&'a mut [u8]> for BufViewMut<'a> {}
563
564impl<'a> AsRef<[u8]> for BufViewMut<'a> {
565 fn as_ref(&self) -> &[u8] {
566 self.buf
567 }
568}
569
570impl<'a> AsMut<[u8]> for BufViewMut<'a> {
571 fn as_mut(&mut self) -> &mut [u8] {
572 self.buf
573 }
574}
575
576#[derive(Copy, Clone, Debug, Eq, PartialEq)]
590pub struct PacketConstraints {
591 header_len: usize,
592 footer_len: usize,
593 min_body_len: usize,
594 max_body_len: usize,
595}
596
597impl PacketConstraints {
598 pub const UNCONSTRAINED: Self =
602 Self { header_len: 0, footer_len: 0, min_body_len: 0, max_body_len: usize::MAX };
603
604 #[inline]
612 pub fn new(
613 header_len: usize,
614 footer_len: usize,
615 min_body_len: usize,
616 max_body_len: usize,
617 ) -> PacketConstraints {
618 PacketConstraints::try_new(header_len, footer_len, min_body_len, max_body_len).expect(
619 "max_body_len < min_body_len or header_len + min_body_len + footer_len overflows usize",
620 )
621 }
622
623 #[inline]
629 pub fn try_new(
630 header_len: usize,
631 footer_len: usize,
632 min_body_len: usize,
633 max_body_len: usize,
634 ) -> Option<PacketConstraints> {
635 let header_min_body_footer_overflows = header_len
637 .checked_add(min_body_len)
638 .and_then(|sum| sum.checked_add(footer_len))
639 .is_none();
640 let max_less_than_min = max_body_len < min_body_len;
642 if max_less_than_min || header_min_body_footer_overflows {
643 return None;
644 }
645 Some(PacketConstraints { header_len, footer_len, min_body_len, max_body_len })
646 }
647
648 #[inline]
652 pub fn with_max_body_len(max_body_len: usize) -> PacketConstraints {
653 PacketConstraints { header_len: 0, footer_len: 0, min_body_len: 0, max_body_len }
658 }
659
660 #[inline]
662 pub fn header_len(&self) -> usize {
663 self.header_len
664 }
665
666 #[inline]
668 pub fn footer_len(&self) -> usize {
669 self.footer_len
670 }
671
672 #[inline]
688 pub fn min_body_len(&self) -> usize {
689 self.min_body_len
690 }
691
692 #[inline]
696 pub fn max_body_len(&self) -> usize {
697 self.max_body_len
698 }
699
700 pub fn try_encapsulate(&self, outer: &Self) -> Option<PacketConstraints> {
710 let inner = self;
711 let header_len = inner.header_len.checked_add(outer.header_len)?;
713 let footer_len = inner.footer_len.checked_add(outer.footer_len)?;
715 let inner_header_footer_len = inner.header_len + inner.footer_len;
718 let min_body_len = cmp::max(
722 outer.min_body_len.saturating_sub(inner_header_footer_len),
723 inner.min_body_len,
724 );
725 let max_body_len =
730 cmp::min(outer.max_body_len.checked_sub(inner_header_footer_len)?, inner.max_body_len);
731 PacketConstraints::try_new(header_len, footer_len, min_body_len, max_body_len)
735 }
736}
737
738pub struct SerializeTarget<'a> {
741 #[allow(missing_docs)]
742 pub header: &'a mut [u8],
743 #[allow(missing_docs)]
744 pub footer: &'a mut [u8],
745}
746
747pub trait PacketBuilder<C: SerializationContext>: NestablePacketBuilder + Sized {
758 fn context_state(&self) -> C::ContextState {
760 C::ContextState::default()
761 }
762
763 fn serialize(
792 &self,
793 context: &mut C,
794 target: &mut SerializeTarget<'_>,
795 body: FragmentedBytesMut<'_, '_>,
796 );
797}
798
799pub trait NestablePacketBuilder: Sized {
800 fn constraints(&self) -> PacketConstraints;
802
803 #[inline]
808 fn wrap_body<B>(self, body: B) -> Nested<B, Self> {
809 Nested { inner: body, outer: self }
810 }
811}
812
813impl<'a, B: NestablePacketBuilder> NestablePacketBuilder for &'a B {
814 #[inline]
815 fn constraints(&self) -> PacketConstraints {
816 B::constraints(self)
817 }
818}
819
820impl<'a, C: SerializationContext, B: PacketBuilder<C>> PacketBuilder<C> for &'a B {
821 #[inline]
822 fn context_state(&self) -> C::ContextState {
823 B::context_state(self)
824 }
825 #[inline]
826 fn serialize(
827 &self,
828 context: &mut C,
829 target: &mut SerializeTarget<'_>,
830 body: FragmentedBytesMut<'_, '_>,
831 ) {
832 B::serialize(self, context, target, body)
833 }
834}
835
836impl<'a, B: NestablePacketBuilder> NestablePacketBuilder for &'a mut B {
837 #[inline]
838 fn constraints(&self) -> PacketConstraints {
839 B::constraints(self)
840 }
841}
842
843impl<'a, C: SerializationContext, B: PacketBuilder<C>> PacketBuilder<C> for &'a mut B {
844 #[inline]
845 fn context_state(&self) -> C::ContextState {
846 B::context_state(self)
847 }
848 #[inline]
849 fn serialize(
850 &self,
851 context: &mut C,
852 target: &mut SerializeTarget<'_>,
853 body: FragmentedBytesMut<'_, '_>,
854 ) {
855 B::serialize(self, context, target, body)
856 }
857}
858
859impl NestablePacketBuilder for () {
860 #[inline]
861 fn constraints(&self) -> PacketConstraints {
862 PacketConstraints::UNCONSTRAINED
863 }
864}
865
866impl<C: SerializationContext> PacketBuilder<C> for () {
867 #[inline]
868 fn serialize(
869 &self,
870 _context: &mut C,
871 _target: &mut SerializeTarget<'_>,
872 _body: FragmentedBytesMut<'_, '_>,
873 ) {
874 }
875}
876
877impl NestablePacketBuilder for Never {
878 fn constraints(&self) -> PacketConstraints {
879 match *self {}
880 }
881}
882
883impl<C: SerializationContext> PacketBuilder<C> for Never {
884 fn serialize(
885 &self,
886 _context: &mut C,
887 _target: &mut SerializeTarget<'_>,
888 _body: FragmentedBytesMut<'_, '_>,
889 ) {
890 }
891}
892
893#[derive(Copy, Clone, Debug, Eq, PartialEq)]
901pub struct Nested<I, O> {
902 inner: I,
903 outer: O,
904}
905
906impl<I, O> Nested<I, O> {
907 #[inline]
910 pub fn into_inner(self) -> I {
911 self.inner
912 }
913
914 #[inline]
917 pub fn into_outer(self) -> O {
918 self.outer
919 }
920
921 #[inline]
922 pub fn inner(&self) -> &I {
923 &self.inner
924 }
925
926 #[inline]
927 pub fn inner_mut(&mut self) -> &mut I {
928 &mut self.inner
929 }
930
931 #[inline]
932 pub fn outer(&self) -> &O {
933 &self.outer
934 }
935
936 #[inline]
937 pub fn outer_mut(&mut self) -> &mut O {
938 &mut self.outer
939 }
940}
941
942#[derive(Copy, Clone, Debug)]
948#[cfg_attr(test, derive(Eq, PartialEq))]
949pub struct LimitedSizePacketBuilder {
950 pub limit: usize,
952}
953
954impl NestablePacketBuilder for LimitedSizePacketBuilder {
955 fn constraints(&self) -> PacketConstraints {
956 PacketConstraints::with_max_body_len(self.limit)
957 }
958}
959
960impl<C: SerializationContext> PacketBuilder<C> for LimitedSizePacketBuilder {
961 fn serialize(
962 &self,
963 _context: &mut C,
964 _target: &mut SerializeTarget<'_>,
965 _body: FragmentedBytesMut<'_, '_>,
966 ) {
967 }
968}
969
970pub trait InnerPacketBuilder {
984 fn bytes_len(&self) -> usize;
986
987 fn serialize(&self, buffer: &mut [u8]);
1002
1003 #[inline]
1010 fn into_serializer(self) -> InnerSerializer<Self, EmptyBuf>
1011 where
1012 Self: Sized,
1013 {
1014 self.into_serializer_with(EmptyBuf)
1015 }
1016
1017 fn into_serializer_with<B: ShrinkBuffer>(self, mut buffer: B) -> InnerSerializer<Self, B>
1030 where
1031 Self: Sized,
1032 {
1033 buffer.shrink_back_to(0);
1034 InnerSerializer { inner: self, buffer }
1035 }
1036}
1037
1038impl<'a, I: InnerPacketBuilder> InnerPacketBuilder for &'a I {
1039 #[inline]
1040 fn bytes_len(&self) -> usize {
1041 I::bytes_len(self)
1042 }
1043 #[inline]
1044 fn serialize(&self, buffer: &mut [u8]) {
1045 I::serialize(self, buffer)
1046 }
1047}
1048impl<'a, I: InnerPacketBuilder> InnerPacketBuilder for &'a mut I {
1049 #[inline]
1050 fn bytes_len(&self) -> usize {
1051 I::bytes_len(self)
1052 }
1053 #[inline]
1054 fn serialize(&self, buffer: &mut [u8]) {
1055 I::serialize(self, buffer)
1056 }
1057}
1058impl<'a> InnerPacketBuilder for &'a [u8] {
1059 #[inline]
1060 fn bytes_len(&self) -> usize {
1061 self.len()
1062 }
1063 #[inline]
1064 fn serialize(&self, buffer: &mut [u8]) {
1065 buffer.copy_from_slice(self);
1066 }
1067}
1068impl<'a> InnerPacketBuilder for &'a mut [u8] {
1069 #[inline]
1070 fn bytes_len(&self) -> usize {
1071 self.len()
1072 }
1073 #[inline]
1074 fn serialize(&self, buffer: &mut [u8]) {
1075 buffer.copy_from_slice(self);
1076 }
1077}
1078impl<'a> InnerPacketBuilder for Vec<u8> {
1079 #[inline]
1080 fn bytes_len(&self) -> usize {
1081 self.len()
1082 }
1083 #[inline]
1084 fn serialize(&self, buffer: &mut [u8]) {
1085 buffer.copy_from_slice(self.as_slice());
1086 }
1087}
1088impl<const N: usize> InnerPacketBuilder for ArrayVec<u8, N> {
1089 fn bytes_len(&self) -> usize {
1090 self.as_slice().bytes_len()
1091 }
1092 fn serialize(&self, buffer: &mut [u8]) {
1093 self.as_slice().serialize(buffer);
1094 }
1095}
1096
1097pub struct ByteSliceInnerPacketBuilder<B>(pub B);
1104
1105impl<B: SplitByteSlice> InnerPacketBuilder for ByteSliceInnerPacketBuilder<B> {
1106 fn bytes_len(&self) -> usize {
1107 self.0.deref().bytes_len()
1108 }
1109 fn serialize(&self, buffer: &mut [u8]) {
1110 self.0.deref().serialize(buffer)
1111 }
1112}
1113
1114impl<B: SplitByteSlice> Debug for ByteSliceInnerPacketBuilder<B> {
1115 fn fmt(&self, f: &mut Formatter<'_>) -> fmt::Result {
1116 write!(f, "ByteSliceInnerPacketBuilder({:?})", self.0.as_ref())
1117 }
1118}
1119
1120#[derive(Copy, Clone, Debug, Eq, PartialEq)]
1127pub enum SerializeError<A> {
1128 Alloc(A),
1130 SizeLimitExceeded,
1132}
1133
1134impl<A> SerializeError<A> {
1135 #[inline]
1137 pub fn is_alloc(&self) -> bool {
1138 match self {
1139 SerializeError::Alloc(_) => true,
1140 SerializeError::SizeLimitExceeded => false,
1141 }
1142 }
1143
1144 #[inline]
1146 pub fn is_size_limit_exceeded(&self) -> bool {
1147 match self {
1148 SerializeError::Alloc(_) => false,
1149 SerializeError::SizeLimitExceeded => true,
1150 }
1151 }
1152
1153 pub fn map_alloc<T, F: FnOnce(A) -> T>(self, f: F) -> SerializeError<T> {
1155 match self {
1156 SerializeError::Alloc(a) => SerializeError::Alloc(f(a)),
1157 SerializeError::SizeLimitExceeded => SerializeError::SizeLimitExceeded,
1158 }
1159 }
1160}
1161
1162impl<A> From<A> for SerializeError<A> {
1163 fn from(a: A) -> SerializeError<A> {
1164 SerializeError::Alloc(a)
1165 }
1166}
1167
1168#[derive(Copy, Clone, Debug, Eq, PartialEq)]
1177pub struct BufferTooShortError;
1178
1179pub trait BufferProvider<Input, Output> {
1196 type Error;
1200
1201 fn alloc_no_reuse(
1211 self,
1212 prefix: usize,
1213 body: usize,
1214 suffix: usize,
1215 ) -> Result<Output, Self::Error>;
1216
1217 fn reuse_or_realloc(
1230 self,
1231 buffer: Input,
1232 prefix: usize,
1233 suffix: usize,
1234 ) -> Result<Output, (Self::Error, Input)>;
1235}
1236
1237pub trait BufferAlloc<Output> {
1258 type Error;
1262
1263 fn alloc(self, len: usize) -> Result<Output, Self::Error>;
1265}
1266
1267impl<O, E, F: FnOnce(usize) -> Result<O, E>> BufferAlloc<O> for F {
1268 type Error = E;
1269
1270 #[inline]
1271 fn alloc(self, len: usize) -> Result<O, E> {
1272 self(len)
1273 }
1274}
1275
1276impl BufferAlloc<Never> for () {
1277 type Error = ();
1278
1279 #[inline]
1280 fn alloc(self, _len: usize) -> Result<Never, ()> {
1281 Err(())
1282 }
1283}
1284
1285pub fn new_buf_vec(len: usize) -> Result<Buf<Vec<u8>>, Never> {
1296 Ok(Buf::new(vec![0; len], ..))
1297}
1298
1299pub trait LayoutBufferAlloc<O> {
1302 type Error;
1306
1307 fn layout_alloc(self, prefix: usize, body: usize, suffix: usize) -> Result<O, Self::Error>;
1310}
1311
1312impl<O: ShrinkBuffer, E, F: FnOnce(usize) -> Result<O, E>> LayoutBufferAlloc<O> for F {
1313 type Error = E;
1314
1315 #[inline]
1316 fn layout_alloc(self, prefix: usize, body: usize, suffix: usize) -> Result<O, E> {
1317 let mut b = self(prefix + body + suffix)?;
1318 b.shrink_front(prefix);
1319 b.shrink_back(suffix);
1320 Ok(b)
1321 }
1322}
1323
1324impl LayoutBufferAlloc<Never> for () {
1325 type Error = ();
1326
1327 #[inline]
1328 fn layout_alloc(self, _prefix: usize, _body: usize, _suffix: usize) -> Result<Never, ()> {
1329 Err(())
1330 }
1331}
1332
1333#[inline]
1355pub fn try_reuse_buffer<B: GrowBufferMut + ShrinkBuffer>(
1356 mut buffer: B,
1357 prefix: usize,
1358 suffix: usize,
1359 max_copy_bytes: usize,
1360) -> Result<B, B> {
1361 let need_prefix = prefix;
1362 let need_suffix = suffix;
1363 let have_prefix = buffer.prefix_len();
1364 let have_body = buffer.len();
1365 let have_suffix = buffer.suffix_len();
1366 let need_capacity = need_prefix + have_body + need_suffix;
1367
1368 if have_prefix >= need_prefix && have_suffix >= need_suffix {
1369 Ok(buffer)
1371 } else if buffer.capacity() >= need_capacity && have_body <= max_copy_bytes {
1372 buffer.reset();
1376
1377 buffer.copy_within(have_prefix..(have_prefix + have_body), need_prefix);
1383 buffer.shrink(need_prefix..(need_prefix + have_body));
1384 debug_assert_eq!(buffer.prefix_len(), need_prefix);
1385 debug_assert!(buffer.suffix_len() >= need_suffix);
1386 debug_assert_eq!(buffer.len(), have_body);
1387 Ok(buffer)
1388 } else {
1389 Err(buffer)
1390 }
1391}
1392
1393pub struct MaybeReuseBufferProvider<A>(pub A);
1397
1398impl<I: ReusableBuffer, O: ReusableBuffer, A: BufferAlloc<O>> BufferProvider<I, Either<I, O>>
1399 for MaybeReuseBufferProvider<A>
1400{
1401 type Error = A::Error;
1402
1403 fn alloc_no_reuse(
1404 self,
1405 prefix: usize,
1406 body: usize,
1407 suffix: usize,
1408 ) -> Result<Either<I, O>, Self::Error> {
1409 let Self(alloc) = self;
1410 let need_capacity = prefix + body + suffix;
1411 BufferAlloc::alloc(alloc, need_capacity).map(|mut buf| {
1412 buf.shrink(prefix..(prefix + body));
1413 Either::B(buf)
1414 })
1415 }
1416
1417 #[inline]
1426 fn reuse_or_realloc(
1427 self,
1428 buffer: I,
1429 need_prefix: usize,
1430 need_suffix: usize,
1431 ) -> Result<Either<I, O>, (A::Error, I)> {
1432 match try_reuse_buffer(buffer, need_prefix, need_suffix, usize::MAX) {
1437 Ok(buffer) => Ok(Either::A(buffer)),
1438 Err(buffer) => {
1439 let have_body = buffer.len();
1440 let mut buf = match BufferProvider::<I, Either<I, O>>::alloc_no_reuse(
1441 self,
1442 need_prefix,
1443 have_body,
1444 need_suffix,
1445 ) {
1446 Ok(buf) => buf,
1447 Err(err) => return Err((err, buffer)),
1448 };
1449
1450 buf.copy_from(&buffer);
1451 debug_assert_eq!(buf.prefix_len(), need_prefix);
1452 debug_assert!(buf.suffix_len() >= need_suffix);
1453 debug_assert_eq!(buf.len(), have_body);
1454 Ok(buf)
1455 }
1456 }
1457 }
1458}
1459
1460impl<B: ReusableBuffer, A: BufferAlloc<B>> BufferProvider<B, B> for MaybeReuseBufferProvider<A> {
1461 type Error = A::Error;
1462
1463 fn alloc_no_reuse(self, prefix: usize, body: usize, suffix: usize) -> Result<B, Self::Error> {
1464 BufferProvider::<B, Either<B, B>>::alloc_no_reuse(self, prefix, body, suffix)
1465 .map(Either::into_inner)
1466 }
1467
1468 #[inline]
1477 fn reuse_or_realloc(self, buffer: B, prefix: usize, suffix: usize) -> Result<B, (A::Error, B)> {
1478 BufferProvider::<B, Either<B, B>>::reuse_or_realloc(self, buffer, prefix, suffix)
1479 .map(Either::into_inner)
1480 }
1481}
1482
1483pub struct NoReuseBufferProvider<A>(pub A);
1487
1488impl<I: FragmentedBuffer, O: ReusableBuffer, A: BufferAlloc<O>> BufferProvider<I, O>
1489 for NoReuseBufferProvider<A>
1490{
1491 type Error = A::Error;
1492
1493 fn alloc_no_reuse(self, prefix: usize, body: usize, suffix: usize) -> Result<O, A::Error> {
1494 let Self(alloc) = self;
1495 alloc.alloc(prefix + body + suffix).map(|mut b| {
1496 b.shrink(prefix..prefix + body);
1497 b
1498 })
1499 }
1500
1501 fn reuse_or_realloc(self, buffer: I, prefix: usize, suffix: usize) -> Result<O, (A::Error, I)> {
1502 BufferProvider::<I, O>::alloc_no_reuse(self, prefix, buffer.len(), suffix)
1503 .map(|mut b| {
1504 b.copy_from(&buffer);
1505 b
1506 })
1507 .map_err(|e| (e, buffer))
1508 }
1509}
1510
1511pub trait SerializationContext: Sized {
1513 type ContextState: Default;
1515
1516 fn serialize_nested<O: PacketBuilder<Self>, R>(
1526 &mut self,
1527 _outer: &O,
1528 constraints: PacketConstraints,
1529 serialize_fn: impl FnOnce(&mut Self, PacketConstraints) -> R,
1530 ) -> R {
1531 serialize_fn(self, constraints)
1532 }
1533}
1534
1535#[derive(Clone, Copy, Debug, Default, Eq, PartialEq)]
1537pub struct NoOpSerializationContext;
1538
1539impl SerializationContext for NoOpSerializationContext {
1540 type ContextState = ();
1541
1542 }
1545
1546pub trait Serializer<C: SerializationContext>: NestableSerializer + Sized {
1547 type Buffer;
1549
1550 fn serialize<B: GrowBufferMut, P: BufferProvider<Self::Buffer, B>>(
1565 self,
1566 context: &mut C,
1567 constraints: PacketConstraints,
1568 provider: P,
1569 ) -> Result<B, (SerializeError<P::Error>, Self)>;
1570
1571 fn serialize_new_buf<B: GrowBufferMut, A: LayoutBufferAlloc<B>>(
1578 &self,
1579 context: &mut C,
1580 constraints: PacketConstraints,
1581 alloc: A,
1582 ) -> Result<B, SerializeError<A::Error>>;
1583
1584 #[inline]
1600 #[allow(clippy::type_complexity)]
1601 fn serialize_vec(
1602 self,
1603 context: &mut C,
1604 constraints: PacketConstraints,
1605 ) -> Result<Either<Self::Buffer, Buf<Vec<u8>>>, (SerializeError<Never>, Self)>
1606 where
1607 Self::Buffer: ReusableBuffer,
1608 {
1609 self.serialize(context, constraints, MaybeReuseBufferProvider(new_buf_vec))
1610 }
1611
1612 #[inline]
1626 fn serialize_no_alloc(
1627 self,
1628 context: &mut C,
1629 constraints: PacketConstraints,
1630 ) -> Result<Self::Buffer, (SerializeError<BufferTooShortError>, Self)>
1631 where
1632 Self::Buffer: ReusableBuffer,
1633 {
1634 self.serialize(context, constraints, MaybeReuseBufferProvider(()))
1635 .map(Either::into_a)
1636 .map_err(|(err, slf)| {
1637 (
1638 match err {
1639 SerializeError::Alloc(()) => BufferTooShortError.into(),
1640 SerializeError::SizeLimitExceeded => SerializeError::SizeLimitExceeded,
1641 },
1642 slf,
1643 )
1644 })
1645 }
1646
1647 #[inline]
1656 fn serialize_outer<B: GrowBufferMut, P: BufferProvider<Self::Buffer, B>>(
1657 self,
1658 context: &mut C,
1659 provider: P,
1660 ) -> Result<B, (SerializeError<P::Error>, Self)> {
1661 self.serialize(context, PacketConstraints::UNCONSTRAINED, provider)
1662 }
1663
1664 #[inline]
1675 #[allow(clippy::type_complexity)]
1676 fn serialize_vec_outer(
1677 self,
1678 context: &mut C,
1679 ) -> Result<Either<Self::Buffer, Buf<Vec<u8>>>, (SerializeError<Never>, Self)>
1680 where
1681 Self::Buffer: ReusableBuffer,
1682 {
1683 self.serialize_vec(context, PacketConstraints::UNCONSTRAINED)
1684 }
1685
1686 #[inline]
1696 fn serialize_no_alloc_outer(
1697 self,
1698 context: &mut C,
1699 ) -> Result<Self::Buffer, (SerializeError<BufferTooShortError>, Self)>
1700 where
1701 Self::Buffer: ReusableBuffer,
1702 {
1703 self.serialize_no_alloc(context, PacketConstraints::UNCONSTRAINED)
1704 }
1705
1706 #[inline]
1709 fn serialize_vec_outer_no_reuse(
1710 &self,
1711 context: &mut C,
1712 ) -> Result<Buf<Vec<u8>>, SerializeError<Never>> {
1713 self.serialize_new_buf(context, PacketConstraints::UNCONSTRAINED, new_buf_vec)
1714 }
1715}
1716
1717pub trait NestableSerializer: Sized {
1721 #[inline]
1728 fn wrap_in<B: NestablePacketBuilder>(self, outer: B) -> Nested<Self, B> {
1729 outer.wrap_body(self)
1730 }
1731
1732 #[inline]
1741 fn with_size_limit(self, limit: usize) -> Nested<Self, LimitedSizePacketBuilder> {
1742 self.wrap_in(LimitedSizePacketBuilder { limit })
1743 }
1744}
1745
1746#[derive(Copy, Clone, Debug, Eq, PartialEq)]
1753pub struct InnerSerializer<I, B> {
1754 inner: I,
1755 buffer: B,
1760}
1761
1762impl<I, B> InnerSerializer<I, B> {
1763 pub fn inner(&self) -> &I {
1764 &self.inner
1765 }
1766}
1767
1768struct InnerPacketBuilderWrapper<I>(I);
1774
1775impl<I: InnerPacketBuilder> NestablePacketBuilder for InnerPacketBuilderWrapper<I> {
1776 fn constraints(&self) -> PacketConstraints {
1777 let Self(wrapped) = self;
1778 PacketConstraints::new(wrapped.bytes_len(), 0, 0, usize::MAX)
1779 }
1780}
1781
1782impl<C: SerializationContext, I: InnerPacketBuilder> PacketBuilder<C>
1783 for InnerPacketBuilderWrapper<I>
1784{
1785 fn serialize(
1786 &self,
1787 _context: &mut C,
1788 target: &mut SerializeTarget<'_>,
1789 _body: FragmentedBytesMut<'_, '_>,
1790 ) {
1791 let Self(wrapped) = self;
1792
1793 debug_assert_eq!(target.header.len(), wrapped.bytes_len());
1797 debug_assert_eq!(target.footer.len(), 0);
1798
1799 InnerPacketBuilder::serialize(wrapped, target.header);
1800 }
1801}
1802
1803impl<C: SerializationContext, I: InnerPacketBuilder, B: GrowBuffer + ShrinkBuffer> Serializer<C>
1804 for InnerSerializer<I, B>
1805{
1806 type Buffer = B;
1807
1808 #[inline]
1809 fn serialize<BB: GrowBufferMut, P: BufferProvider<B, BB>>(
1810 self,
1811 context: &mut C,
1812 constraints: PacketConstraints,
1813 provider: P,
1814 ) -> Result<BB, (SerializeError<P::Error>, InnerSerializer<I, B>)> {
1815 debug_assert_eq!(self.buffer.len(), 0);
1816 InnerPacketBuilderWrapper(self.inner)
1817 .wrap_body(self.buffer)
1818 .serialize(context, constraints, provider)
1819 .map_err(|(err, Nested { inner: buffer, outer: pb })| {
1820 (err, InnerSerializer { inner: pb.0, buffer })
1821 })
1822 }
1823
1824 #[inline]
1825 fn serialize_new_buf<BB: GrowBufferMut, A: LayoutBufferAlloc<BB>>(
1826 &self,
1827 context: &mut C,
1828 outer: PacketConstraints,
1829 alloc: A,
1830 ) -> Result<BB, SerializeError<A::Error>> {
1831 InnerPacketBuilderWrapper(&self.inner)
1832 .wrap_body(EmptyBuf)
1833 .serialize_new_buf(context, outer, alloc)
1834 }
1835}
1836
1837impl<I: InnerPacketBuilder, B: GrowBuffer + ShrinkBuffer> NestableSerializer
1838 for InnerSerializer<I, B>
1839{
1840}
1841
1842impl<C: SerializationContext, B: GrowBuffer + ShrinkBuffer> Serializer<C> for B {
1843 type Buffer = B;
1844
1845 #[inline]
1846 fn serialize<BB: GrowBufferMut, P: BufferProvider<Self::Buffer, BB>>(
1847 self,
1848 context: &mut C,
1849 constraints: PacketConstraints,
1850 provider: P,
1851 ) -> Result<BB, (SerializeError<P::Error>, Self)> {
1852 TruncatingSerializer::new(self, TruncateDirection::NoTruncating)
1853 .serialize(context, constraints, provider)
1854 .map_err(|(err, ser)| (err, ser.buffer))
1855 }
1856
1857 fn serialize_new_buf<BB: GrowBufferMut, A: LayoutBufferAlloc<BB>>(
1858 &self,
1859 _context: &mut C,
1860 constraints: PacketConstraints,
1861 alloc: A,
1862 ) -> Result<BB, SerializeError<A::Error>> {
1863 if self.len() > constraints.max_body_len() {
1864 return Err(SerializeError::SizeLimitExceeded);
1865 }
1866
1867 let padding = constraints.min_body_len().saturating_sub(self.len());
1868 let tail_size = padding + constraints.footer_len();
1869 let mut buffer = alloc.layout_alloc(constraints.header_len(), self.len(), tail_size)?;
1870 buffer.copy_from(self);
1871 buffer.grow_back_zero(padding);
1872 Ok(buffer)
1873 }
1874}
1875
1876impl<B: GrowBuffer + ShrinkBuffer> NestableSerializer for B {}
1877
1878pub enum EitherSerializer<A, B> {
1882 A(A),
1883 B(B),
1884}
1885
1886impl<C: SerializationContext, A: Serializer<C>, B: Serializer<C, Buffer = A::Buffer>> Serializer<C>
1887 for EitherSerializer<A, B>
1888{
1889 type Buffer = A::Buffer;
1890
1891 fn serialize<TB: GrowBufferMut, P: BufferProvider<Self::Buffer, TB>>(
1892 self,
1893 context: &mut C,
1894 constraints: PacketConstraints,
1895 provider: P,
1896 ) -> Result<TB, (SerializeError<P::Error>, Self)> {
1897 match self {
1898 EitherSerializer::A(s) => s
1899 .serialize(context, constraints, provider)
1900 .map_err(|(err, s)| (err, EitherSerializer::A(s))),
1901 EitherSerializer::B(s) => s
1902 .serialize(context, constraints, provider)
1903 .map_err(|(err, s)| (err, EitherSerializer::B(s))),
1904 }
1905 }
1906
1907 fn serialize_new_buf<TB: GrowBufferMut, BA: LayoutBufferAlloc<TB>>(
1908 &self,
1909 context: &mut C,
1910 outer: PacketConstraints,
1911 alloc: BA,
1912 ) -> Result<TB, SerializeError<BA::Error>> {
1913 match self {
1914 EitherSerializer::A(s) => s.serialize_new_buf(context, outer, alloc),
1915 EitherSerializer::B(s) => s.serialize_new_buf(context, outer, alloc),
1916 }
1917 }
1918}
1919
1920impl<A: NestableSerializer, B: NestableSerializer> NestableSerializer for EitherSerializer<A, B> {}
1921
1922#[derive(Copy, Clone, Debug, Eq, PartialEq)]
1925pub enum TruncateDirection {
1926 DiscardFront,
1929 DiscardBack,
1932 NoTruncating,
1934}
1935
1936#[derive(Copy, Clone, Debug, Eq, PartialEq)]
1948pub struct TruncatingSerializer<B> {
1949 buffer: B,
1950 direction: TruncateDirection,
1951}
1952
1953impl<B> TruncatingSerializer<B> {
1954 pub fn new(buffer: B, direction: TruncateDirection) -> TruncatingSerializer<B> {
1956 TruncatingSerializer { buffer, direction }
1957 }
1958
1959 pub fn buffer(&self) -> &B {
1961 &self.buffer
1962 }
1963
1964 pub fn buffer_mut(&mut self) -> &mut B {
1966 &mut self.buffer
1967 }
1968}
1969
1970impl<C: SerializationContext, B: GrowBuffer + ShrinkBuffer> Serializer<C>
1971 for TruncatingSerializer<B>
1972{
1973 type Buffer = B;
1974
1975 fn serialize<BB: GrowBufferMut, P: BufferProvider<B, BB>>(
1976 mut self,
1977 _context: &mut C,
1978 constraints: PacketConstraints,
1979 provider: P,
1980 ) -> Result<BB, (SerializeError<P::Error>, Self)> {
1981 let original_len = self.buffer.len();
1982 let excess_bytes = if original_len > constraints.max_body_len() {
1983 Some(original_len - constraints.max_body_len())
1984 } else {
1985 None
1986 };
1987 if let Some(excess_bytes) = excess_bytes {
1988 match self.direction {
1989 TruncateDirection::DiscardFront => self.buffer.shrink_front(excess_bytes),
1990 TruncateDirection::DiscardBack => self.buffer.shrink_back(excess_bytes),
1991 TruncateDirection::NoTruncating => {
1992 return Err((SerializeError::SizeLimitExceeded, self));
1993 }
1994 }
1995 }
1996
1997 let padding = constraints.min_body_len().saturating_sub(self.buffer.len());
1998
1999 debug_assert!(self.buffer.len() + padding <= constraints.max_body_len());
2003 match provider.reuse_or_realloc(
2004 self.buffer,
2005 constraints.header_len(),
2006 padding + constraints.footer_len(),
2007 ) {
2008 Ok(buffer) => Ok(buffer),
2009 Err((err, mut buffer)) => {
2010 if let Some(excess_bytes) = excess_bytes {
2014 match self.direction {
2015 TruncateDirection::DiscardFront => buffer.grow_front(excess_bytes),
2016 TruncateDirection::DiscardBack => buffer.grow_back(excess_bytes),
2017 TruncateDirection::NoTruncating => unreachable!(),
2018 }
2019 }
2020
2021 Err((
2022 SerializeError::Alloc(err),
2023 TruncatingSerializer { buffer, direction: self.direction },
2024 ))
2025 }
2026 }
2027 }
2028
2029 fn serialize_new_buf<BB: GrowBufferMut, A: LayoutBufferAlloc<BB>>(
2030 &self,
2031 _context: &mut C,
2032 outer: PacketConstraints,
2033 alloc: A,
2034 ) -> Result<BB, SerializeError<A::Error>> {
2035 let truncated_size = cmp::min(self.buffer.len(), outer.max_body_len());
2036 let discarded_bytes = self.buffer.len() - truncated_size;
2037 let padding = outer.min_body_len().saturating_sub(truncated_size);
2038 let tail_size = padding + outer.footer_len();
2039 let mut buffer = alloc.layout_alloc(outer.header_len(), truncated_size, tail_size)?;
2040 buffer.with_bytes_mut(|mut dst| {
2041 self.buffer.with_bytes(|src| {
2042 let src = match (discarded_bytes > 0, self.direction) {
2043 (false, _) => src,
2044 (true, TruncateDirection::DiscardFront) => src.slice(discarded_bytes..),
2045 (true, TruncateDirection::DiscardBack) => src.slice(..truncated_size),
2046 (true, TruncateDirection::NoTruncating) => {
2047 return Err(SerializeError::SizeLimitExceeded);
2048 }
2049 };
2050 dst.copy_from(&src);
2051 Ok(())
2052 })
2053 })?;
2054 buffer.grow_back_zero(padding);
2055 Ok(buffer)
2056 }
2057}
2058
2059impl<B: GrowBuffer + ShrinkBuffer> NestableSerializer for TruncatingSerializer<B> {}
2060
2061impl<C: SerializationContext, I: Serializer<C>, O: PacketBuilder<C>> Serializer<C>
2062 for Nested<I, O>
2063{
2064 type Buffer = I::Buffer;
2065
2066 #[inline]
2067 fn serialize<B: GrowBufferMut, P: BufferProvider<I::Buffer, B>>(
2068 self,
2069 context: &mut C,
2070 constraints: PacketConstraints,
2071 provider: P,
2072 ) -> Result<B, (SerializeError<P::Error>, Self)> {
2073 context
2074 .serialize_nested(&self.outer, constraints, |context, constraints| {
2075 let Some(constraints) = self.outer.constraints().try_encapsulate(&constraints)
2076 else {
2077 return Err((SerializeError::SizeLimitExceeded, self.inner));
2078 };
2079 self.inner.serialize(context, constraints, provider).map(|mut buf| {
2080 buf.serialize(context, &self.outer);
2081 buf
2082 })
2083 })
2084 .map_err(|(err, inner)| (err, self.outer.wrap_body(inner)))
2085 }
2086
2087 #[inline]
2088 fn serialize_new_buf<B: GrowBufferMut, A: LayoutBufferAlloc<B>>(
2089 &self,
2090 context: &mut C,
2091 constraints: PacketConstraints,
2092 alloc: A,
2093 ) -> Result<B, SerializeError<A::Error>> {
2094 context.serialize_nested(&self.outer, constraints, |context, constraints| {
2095 let Some(constraints) = self.outer.constraints().try_encapsulate(&constraints) else {
2096 return Err(SerializeError::SizeLimitExceeded);
2097 };
2098 self.inner.serialize_new_buf(context, constraints, alloc).map(|mut buf| {
2099 buf.serialize(context, &self.outer);
2100 buf
2101 })
2102 })
2103 }
2104}
2105
2106impl<I: NestableSerializer, O: NestablePacketBuilder> NestableSerializer for Nested<I, O> {}
2107
2108pub trait PartialPacketBuilder<C: SerializationContext>: PacketBuilder<C> {
2110 fn partial_serialize(&self, context: &mut C, body_len: usize, buffer: &mut [u8]);
2119}
2120
2121impl<C: SerializationContext> PartialPacketBuilder<C> for () {
2122 fn partial_serialize(&self, _context: &mut C, _body_len: usize, _buffer: &mut [u8]) {}
2123}
2124
2125#[derive(Debug, Eq, PartialEq)]
2127pub enum PartialSerializeResult<'a, B> {
2128 Slice(&'a [u8]),
2129 NewBuffer { buffer: B, total_size: usize },
2130}
2131
2132pub trait PartialSerializer<C: SerializationContext> {
2137 fn partial_serialize<B: GrowBufferMut + ContiguousBuffer, A: LayoutBufferAlloc<B>>(
2141 &self,
2142 context: &mut C,
2143 alloc: A,
2144 ) -> Result<PartialSerializeResult<'_, B>, SerializeError<A::Error>> {
2145 let (buffer, total_size) =
2146 self.partial_serialize_new_buf(context, PacketConstraints::UNCONSTRAINED, alloc)?;
2147 Ok(PartialSerializeResult::NewBuffer { buffer, total_size })
2148 }
2149
2150 fn partial_serialize_new_buf<B: GrowBufferMut, A: LayoutBufferAlloc<B>>(
2160 &self,
2161 context: &mut C,
2162 constraints: PacketConstraints,
2163 alloc: A,
2164 ) -> Result<(B, usize), SerializeError<A::Error>>;
2165}
2166
2167impl<C, B> PartialSerializer<C> for B
2168where
2169 C: SerializationContext,
2170 B: GrowBuffer + ShrinkBuffer,
2171{
2172 fn partial_serialize_new_buf<BB: GrowBufferMut, A: LayoutBufferAlloc<BB>>(
2173 &self,
2174 _context: &mut C,
2175 constraints: PacketConstraints,
2176 alloc: A,
2177 ) -> Result<(BB, usize), SerializeError<A::Error>> {
2178 let buffer = alloc.layout_alloc(constraints.header_len(), 0, 0)?;
2179 Ok((buffer, self.len()))
2180 }
2181}
2182
2183impl<C, B> PartialSerializer<C> for TruncatingSerializer<B>
2184where
2185 C: SerializationContext,
2186 B: GrowBuffer + ShrinkBuffer,
2187{
2188 fn partial_serialize_new_buf<BB: GrowBufferMut, A: LayoutBufferAlloc<BB>>(
2189 &self,
2190 _context: &mut C,
2191 constraints: PacketConstraints,
2192 alloc: A,
2193 ) -> Result<(BB, usize), SerializeError<A::Error>> {
2194 let total_size = cmp::max(
2195 constraints.min_body_len(),
2196 cmp::min(self.buffer().len(), constraints.max_body_len()),
2197 );
2198 let buffer = alloc.layout_alloc(constraints.header_len(), 0, 0)?;
2199 Ok((buffer, total_size))
2200 }
2201}
2202
2203impl<C, I, B> PartialSerializer<C> for InnerSerializer<I, B>
2204where
2205 C: SerializationContext,
2206 I: InnerPacketBuilder,
2207 B: GrowBuffer + ShrinkBuffer,
2208{
2209 fn partial_serialize_new_buf<BB: GrowBufferMut, A: LayoutBufferAlloc<BB>>(
2210 &self,
2211 _context: &mut C,
2212 constraints: PacketConstraints,
2213 alloc: A,
2214 ) -> Result<(BB, usize), SerializeError<A::Error>> {
2215 let total_size = cmp::max(self.inner().bytes_len(), constraints.min_body_len());
2216 let buffer = alloc.layout_alloc(constraints.header_len(), 0, 0)?;
2217 Ok((buffer, total_size))
2218 }
2219}
2220
2221impl<C, A, B> PartialSerializer<C> for EitherSerializer<A, B>
2222where
2223 C: SerializationContext,
2224 A: PartialSerializer<C>,
2225 B: PartialSerializer<C>,
2226{
2227 fn partial_serialize_new_buf<BB: GrowBufferMut, AA: LayoutBufferAlloc<BB>>(
2228 &self,
2229 context: &mut C,
2230 constraints: PacketConstraints,
2231 alloc: AA,
2232 ) -> Result<(BB, usize), SerializeError<AA::Error>> {
2233 match self {
2234 EitherSerializer::A(s) => s.partial_serialize_new_buf(context, constraints, alloc),
2235 EitherSerializer::B(s) => s.partial_serialize_new_buf(context, constraints, alloc),
2236 }
2237 }
2238}
2239
2240impl<C, I, O> PartialSerializer<C> for Nested<I, O>
2241where
2242 C: SerializationContext,
2243 I: PartialSerializer<C>,
2244 O: PartialPacketBuilder<C>,
2245{
2246 fn partial_serialize_new_buf<B: GrowBufferMut, A: LayoutBufferAlloc<B>>(
2247 &self,
2248 context: &mut C,
2249 constraints: PacketConstraints,
2250 alloc: A,
2251 ) -> Result<(B, usize), SerializeError<A::Error>> {
2252 context.serialize_nested(&self.outer, constraints, |context, constraints| {
2253 let header_constraints = self.outer.constraints();
2254 let Some(constraints) = header_constraints.try_encapsulate(&constraints) else {
2255 return Err(SerializeError::SizeLimitExceeded);
2256 };
2257 let header_len = header_constraints.header_len();
2258 let (mut buffer, mut total_size) =
2259 self.inner.partial_serialize_new_buf(context, constraints, alloc)?;
2260 buffer.with_parts_mut(|prefix, _body, _suffix| {
2261 let header_offset = prefix.len() - header_len;
2262 let header = &mut prefix[header_offset..];
2263 self.outer.partial_serialize(context, total_size, header);
2264 });
2265 buffer.grow_front(header_len);
2266 total_size += header_len + header_constraints.footer_len();
2267 Ok((buffer, total_size))
2268 })
2269 }
2270}
2271
2272mod sealed {
2273 use super::*;
2274
2275 pub trait DynamicSerializerInner<C: SerializationContext> {
2280 fn serialize_dyn_alloc(
2290 &self,
2291 context: &mut C,
2292 outer: PacketConstraints,
2293 alloc: &mut dyn DynamicBufferAlloc,
2294 ) -> Result<(usize, usize), SerializeError<DynAllocError>>;
2295 }
2296
2297 pub trait DynamicPartialSerializerInner<C: SerializationContext> {
2298 fn partial_serialize_dyn_alloc(
2299 &self,
2300 context: &mut C,
2301 constraints: PacketConstraints,
2302 alloc: &mut dyn DynamicBufferAlloc,
2303 ) -> Result<usize, SerializeError<DynAllocError>>;
2304 }
2305
2306 pub trait DynamicBufferAlloc {
2312 fn alloc(
2330 &mut self,
2331 prefix: usize,
2332 body: usize,
2333 suffix: usize,
2334 ) -> Result<Buf<&mut [u8]>, DynAllocError>;
2335 }
2336
2337 pub struct DynAllocError;
2340}
2341
2342use sealed::{
2343 DynAllocError, DynamicBufferAlloc, DynamicPartialSerializerInner, DynamicSerializerInner,
2344};
2345
2346enum DynBufferAlloc<A: LayoutBufferAlloc<B>, B> {
2348 Empty,
2349 Alloc(A),
2350 Buffer(B),
2351 Error(A::Error),
2352}
2353
2354impl<A: LayoutBufferAlloc<B>, B> DynBufferAlloc<A, B> {
2355 fn take_buffer(self) -> B {
2356 let DynBufferAlloc::Buffer(b) = self else { unreachable!("unexpected alloc state") };
2357 b
2358 }
2359
2360 fn take_error(self) -> A::Error {
2361 let DynBufferAlloc::Error(e) = self else { unreachable!("unexpected alloc state") };
2362 e
2363 }
2364}
2365
2366impl<A: LayoutBufferAlloc<B>, B: GrowBufferMut> DynamicBufferAlloc for DynBufferAlloc<A, B> {
2367 fn alloc(
2368 &mut self,
2369 prefix: usize,
2370 body: usize,
2371 suffix: usize,
2372 ) -> Result<Buf<&mut [u8]>, DynAllocError> {
2373 let alloc = match core::mem::replace(self, Self::Empty) {
2374 Self::Alloc(a) => a,
2375 _ => panic!("unexpected alloc state"),
2376 };
2377
2378 let buffer = match alloc.layout_alloc(prefix, body, suffix) {
2379 Ok(b) => b,
2380 Err(e) => {
2381 *self = Self::Error(e);
2382 return Err(DynAllocError);
2383 }
2384 };
2385 *self = Self::Buffer(buffer);
2386 let buffer = match self {
2387 Self::Buffer(b) => b.with_all_contents_mut(|b| match b.try_into_contiguous() {
2388 Ok(b) => b,
2389 Err(_) => {
2390 todo!("https://fxbug.dev/428952155: support dyn serialize fragmented buffers")
2391 }
2392 }),
2393 _ => unreachable!(),
2395 };
2396 Ok(Buf::new(buffer, prefix..(buffer.len() - suffix)))
2397 }
2398}
2399
2400fn dyn_serialize_new_buf<C: SerializationContext, B: GrowBufferMut, A: LayoutBufferAlloc<B>>(
2401 serializer: &dyn DynamicSerializerInner<C>,
2402 context: &mut C,
2403 outer: PacketConstraints,
2404 alloc: A,
2405) -> Result<B, SerializeError<A::Error>> {
2406 let mut alloc = DynBufferAlloc::Alloc(alloc);
2407 let (prefix, suffix) = match serializer.serialize_dyn_alloc(context, outer, &mut alloc) {
2408 Ok(result) => result,
2409 Err(SerializeError::SizeLimitExceeded) => return Err(SerializeError::SizeLimitExceeded),
2410 Err(SerializeError::Alloc(DynAllocError)) => {
2411 return Err(SerializeError::Alloc(alloc.take_error()));
2412 }
2413 };
2414
2415 let mut buffer = alloc.take_buffer();
2416 buffer.grow_front(buffer.prefix_len().checked_sub(prefix).unwrap_or_else(|| {
2417 panic!("failed to grow buffer front; want: {} got: {}", prefix, buffer.prefix_len())
2418 }));
2419 buffer.grow_back(buffer.suffix_len().checked_sub(suffix).unwrap_or_else(|| {
2420 panic!("failed to grow buffer back; want: {} got: {}", suffix, buffer.suffix_len())
2421 }));
2422 Ok(buffer)
2423}
2424
2425#[derive(Copy, Clone)]
2430pub struct DynSerializer<'a, C: SerializationContext>(&'a dyn DynamicSerializerInner<C>);
2431
2432impl<'a, C: SerializationContext> DynSerializer<'a, C> {
2433 pub fn new<S: Serializer<C>>(s: &'a S) -> Self {
2435 Self::new_dyn(s)
2436 }
2437
2438 pub fn new_dyn(s: &'a dyn DynamicSerializer<C>) -> Self {
2440 Self(s)
2441 }
2442}
2443
2444impl<C: SerializationContext> Serializer<C> for DynSerializer<'_, C> {
2445 type Buffer = EmptyBuf;
2446
2447 fn serialize<B: GrowBufferMut, P: BufferProvider<Self::Buffer, B>>(
2448 self,
2449 context: &mut C,
2450 constraints: PacketConstraints,
2451 provider: P,
2452 ) -> Result<B, (SerializeError<P::Error>, Self)> {
2453 struct Adapter<S, P>(P, PhantomData<S>);
2454
2455 impl<S, B, P> LayoutBufferAlloc<B> for Adapter<S, P>
2456 where
2457 P: BufferProvider<S, B>,
2458 {
2459 type Error = P::Error;
2460
2461 fn layout_alloc(
2462 self,
2463 prefix: usize,
2464 body: usize,
2465 suffix: usize,
2466 ) -> Result<B, Self::Error> {
2467 let Self(provider, PhantomData) = self;
2468 provider.alloc_no_reuse(prefix, body, suffix)
2469 }
2470 }
2471
2472 let Self(serializer) = self;
2473 match dyn_serialize_new_buf(
2474 serializer,
2475 context,
2476 constraints,
2477 Adapter(provider, PhantomData),
2478 ) {
2479 Ok(b) => Ok(b),
2480 Err(e) => Err((e, self)),
2481 }
2482 }
2483
2484 fn serialize_new_buf<B: GrowBufferMut, A: LayoutBufferAlloc<B>>(
2485 &self,
2486 context: &mut C,
2487 constraints: PacketConstraints,
2488 alloc: A,
2489 ) -> Result<B, SerializeError<A::Error>> {
2490 let Self(serializer) = self;
2491 dyn_serialize_new_buf(*serializer, context, constraints, alloc)
2492 }
2493}
2494
2495struct DynamicBufferAllocAdapter<'a>(&'a mut dyn DynamicBufferAlloc);
2497impl<'a> LayoutBufferAlloc<Buf<&'a mut [u8]>> for DynamicBufferAllocAdapter<'a> {
2498 type Error = DynAllocError;
2499
2500 fn layout_alloc(
2501 self,
2502 prefix: usize,
2503 body: usize,
2504 suffix: usize,
2505 ) -> Result<Buf<&'a mut [u8]>, Self::Error> {
2506 let Self(inner) = self;
2507 inner.alloc(prefix, body, suffix)
2508 }
2509}
2510
2511impl<C: SerializationContext> NestableSerializer for DynSerializer<'_, C> {}
2512
2513impl<C: SerializationContext, O: Serializer<C>> DynamicSerializerInner<C> for O {
2514 fn serialize_dyn_alloc(
2515 &self,
2516 context: &mut C,
2517 outer: PacketConstraints,
2518 alloc: &mut dyn DynamicBufferAlloc,
2519 ) -> Result<(usize, usize), SerializeError<DynAllocError>> {
2520 self.serialize_new_buf(context, outer, DynamicBufferAllocAdapter(alloc))
2521 .map(|buffer| (buffer.prefix_len(), buffer.suffix_len()))
2522 }
2523}
2524
2525pub trait DynamicSerializer<C: SerializationContext>: DynamicSerializerInner<C> {}
2540impl<C: SerializationContext, O: DynamicSerializerInner<C>> DynamicSerializer<C> for O {}
2541
2542#[derive(Copy, Clone)]
2543pub struct DynPartialSerializer<'a, C: SerializationContext>(
2544 &'a dyn DynamicPartialSerializerInner<C>,
2545);
2546
2547impl<'a, C: SerializationContext> DynPartialSerializer<'a, C> {
2548 pub fn new_dyn(s: &'a dyn DynamicPartialSerializerInner<C>) -> Self {
2549 Self(s)
2550 }
2551}
2552
2553impl<'a, C: SerializationContext> PartialSerializer<C> for DynPartialSerializer<'a, C> {
2554 fn partial_serialize_new_buf<B: GrowBufferMut, A: LayoutBufferAlloc<B>>(
2555 &self,
2556 context: &mut C,
2557 constraints: PacketConstraints,
2558 alloc: A,
2559 ) -> Result<(B, usize), SerializeError<A::Error>> {
2560 let Self(inner) = self;
2561 let mut alloc = DynBufferAlloc::Alloc(alloc);
2562 let total_size = match inner.partial_serialize_dyn_alloc(context, constraints, &mut alloc) {
2563 Ok(result) => result,
2564 Err(SerializeError::SizeLimitExceeded) => {
2565 return Err(SerializeError::SizeLimitExceeded);
2566 }
2567 Err(SerializeError::Alloc(DynAllocError)) => {
2568 return Err(SerializeError::Alloc(alloc.take_error()));
2569 }
2570 };
2571
2572 let mut buffer = alloc.take_buffer();
2573 buffer.grow_front(
2574 buffer.prefix_len().checked_sub(constraints.header_len()).unwrap_or_else(|| {
2575 panic!(
2576 "failed to grow buffer front; want: {} got: {}",
2577 constraints.header_len(),
2578 buffer.prefix_len()
2579 )
2580 }),
2581 );
2582 Ok((buffer, total_size))
2583 }
2584}
2585
2586impl<C: SerializationContext, O: PartialSerializer<C>> DynamicPartialSerializerInner<C> for O {
2587 fn partial_serialize_dyn_alloc(
2588 &self,
2589 context: &mut C,
2590 constraints: PacketConstraints,
2591 alloc: &mut dyn DynamicBufferAlloc,
2592 ) -> Result<usize, SerializeError<DynAllocError>> {
2593 self.partial_serialize_new_buf(context, constraints, DynamicBufferAllocAdapter(alloc))
2594 .map(|(_buf, total_size)| total_size)
2595 }
2596}
2597pub trait DynamicPartialSerializer<C: SerializationContext>:
2598 DynamicPartialSerializerInner<C>
2599{
2600}
2601
2602impl<C: SerializationContext, O: DynamicPartialSerializerInner<C>> DynamicPartialSerializer<C>
2603 for O
2604{
2605}
2606
2607#[cfg(test)]
2608mod tests {
2609 use super::*;
2610 use crate::BufferMut;
2611 use assert_matches::assert_matches;
2612 use std::fmt::Debug;
2613 use test_case::test_case;
2614 use test_util::{assert_geq, assert_leq};
2615
2616 fn dirty_buf_alloc(len: usize) -> Result<Buf<Vec<u8>>, Never> {
2617 Ok(Buf::new(vec![0xAA; len], ..))
2618 }
2619
2620 #[derive(Copy, Clone, Debug, Eq, PartialEq)]
2626 struct DummyPacketBuilder {
2627 header_len: usize,
2628 footer_len: usize,
2629 min_body_len: usize,
2630 max_body_len: usize,
2631 header_byte: u8,
2632 footer_byte: u8,
2633 }
2634
2635 impl DummyPacketBuilder {
2636 fn new(
2637 header_len: usize,
2638 footer_len: usize,
2639 min_body_len: usize,
2640 max_body_len: usize,
2641 ) -> DummyPacketBuilder {
2642 DummyPacketBuilder {
2643 header_len,
2644 footer_len,
2645 min_body_len,
2646 max_body_len,
2647 header_byte: 0xFF,
2648 footer_byte: 0xFE,
2649 }
2650 }
2651 }
2652
2653 impl NestablePacketBuilder for DummyPacketBuilder {
2654 fn constraints(&self) -> PacketConstraints {
2655 PacketConstraints::new(
2656 self.header_len,
2657 self.footer_len,
2658 self.min_body_len,
2659 self.max_body_len,
2660 )
2661 }
2662 }
2663
2664 impl<C: SerializationContext> PacketBuilder<C> for DummyPacketBuilder {
2665 fn serialize(
2666 &self,
2667 _context: &mut C,
2668 target: &mut SerializeTarget<'_>,
2669 body: FragmentedBytesMut<'_, '_>,
2670 ) {
2671 assert_eq!(target.header.len(), self.header_len);
2672 assert_eq!(target.footer.len(), self.footer_len);
2673 assert!(body.len() >= self.min_body_len);
2674 assert!(body.len() <= self.max_body_len);
2675 target.header.fill(self.header_byte);
2676 target.footer.fill(self.footer_byte);
2677 }
2678 }
2679
2680 impl<C: SerializationContext> PartialPacketBuilder<C> for DummyPacketBuilder {
2681 fn partial_serialize(&self, _context: &mut C, _body_len: usize, buffer: &mut [u8]) {
2682 buffer.fill(self.header_byte)
2683 }
2684 }
2685
2686 impl InnerPacketBuilder for DummyPacketBuilder {
2687 fn bytes_len(&self) -> usize {
2688 self.header_len
2689 }
2690
2691 fn serialize(&self, buffer: &mut [u8]) {
2692 assert_eq!(buffer.len(), self.header_len);
2693 buffer.fill(self.header_byte);
2694 }
2695 }
2696
2697 #[derive(Copy, Clone, Debug, Eq, PartialEq)]
2699 struct SerializerVerifier {
2700 inner_len: Option<usize>,
2703
2704 truncating: bool,
2707 }
2708
2709 impl SerializerVerifier {
2710 fn new<S: Serializer<NoOpSerializationContext>>(serializer: &S, truncating: bool) -> Self {
2711 let inner_len = serializer
2712 .serialize_new_buf(
2713 &mut NoOpSerializationContext,
2714 PacketConstraints::UNCONSTRAINED,
2715 new_buf_vec,
2716 )
2717 .map(|buf| buf.len())
2718 .inspect_err(|err| assert!(err.is_size_limit_exceeded()))
2719 .ok();
2720 Self { inner_len, truncating }
2721 }
2722
2723 fn verify_result<B: GrowBufferMut, A>(
2724 &self,
2725 result: Result<&B, &SerializeError<A>>,
2726 outer: PacketConstraints,
2727 ) {
2728 let should_exceed_size_limit = match self.inner_len {
2729 Some(inner_len) => outer.max_body_len() < inner_len && !self.truncating,
2730 None => true,
2731 };
2732
2733 match result {
2734 Ok(buf) => {
2735 assert_geq!(buf.prefix_len(), outer.header_len());
2736 assert_geq!(buf.suffix_len(), outer.footer_len());
2737 assert_leq!(buf.len(), outer.max_body_len());
2738
2739 let padding = outer.min_body_len().saturating_sub(buf.len());
2744 assert_leq!(padding + outer.footer_len(), buf.suffix_len());
2745
2746 assert!(!should_exceed_size_limit);
2747 }
2748 Err(err) => {
2749 if should_exceed_size_limit {
2752 assert!(err.is_size_limit_exceeded());
2753 } else {
2754 assert!(err.is_alloc());
2755 }
2756 }
2757 }
2758 }
2759 }
2760
2761 #[derive(Copy, Clone, Debug, Eq, PartialEq)]
2770 struct VerifyingSerializer<S> {
2771 ser: S,
2772 verifier: SerializerVerifier,
2773 }
2774
2775 impl<S: Serializer<NoOpSerializationContext> + Debug + Clone + Eq>
2776 Serializer<NoOpSerializationContext> for VerifyingSerializer<S>
2777 where
2778 S::Buffer: ReusableBuffer,
2779 {
2780 type Buffer = S::Buffer;
2781
2782 fn serialize<B: GrowBufferMut, P: BufferProvider<Self::Buffer, B>>(
2783 self,
2784 context: &mut NoOpSerializationContext,
2785 constraints: PacketConstraints,
2786 provider: P,
2787 ) -> Result<B, (SerializeError<P::Error>, Self)> {
2788 let Self { ser, verifier } = self;
2789 let orig = ser.clone();
2790
2791 let result = ser.serialize(context, constraints, provider).map_err(|(err, ser)| {
2792 assert_eq!(ser, orig);
2795 (err, Self { ser, verifier })
2796 });
2797
2798 verifier.verify_result(result.as_ref().map_err(|(err, _ser)| err), constraints);
2799
2800 result
2801 }
2802
2803 fn serialize_new_buf<B: GrowBufferMut, A: LayoutBufferAlloc<B>>(
2804 &self,
2805 context: &mut NoOpSerializationContext,
2806 outer: PacketConstraints,
2807 alloc: A,
2808 ) -> Result<B, SerializeError<A::Error>> {
2809 let res = self.ser.serialize_new_buf(context, outer, alloc);
2810 self.verifier.verify_result(res.as_ref(), outer);
2811 res
2812 }
2813 }
2814
2815 impl<S> NestableSerializer for VerifyingSerializer<S> {}
2816
2817 trait SerializerExt: Serializer<NoOpSerializationContext> {
2818 fn into_verifying(self, truncating: bool) -> VerifyingSerializer<Self>
2819 where
2820 Self::Buffer: ReusableBuffer,
2821 {
2822 let verifier = SerializerVerifier::new(&self, truncating);
2823 VerifyingSerializer { ser: self, verifier }
2824 }
2825
2826 fn wrap_in_verifying<B: PacketBuilder<NoOpSerializationContext>>(
2827 self,
2828 outer: B,
2829 truncating: bool,
2830 ) -> VerifyingSerializer<Nested<Self, B>>
2831 where
2832 Self::Buffer: ReusableBuffer,
2833 {
2834 self.wrap_in(outer).into_verifying(truncating)
2835 }
2836
2837 fn with_size_limit_verifying(
2838 self,
2839 limit: usize,
2840 truncating: bool,
2841 ) -> VerifyingSerializer<Nested<Self, LimitedSizePacketBuilder>>
2842 where
2843 Self::Buffer: ReusableBuffer,
2844 {
2845 self.with_size_limit(limit).into_verifying(truncating)
2846 }
2847 }
2848
2849 impl<S: Serializer<NoOpSerializationContext>> SerializerExt for S {}
2850
2851 #[test]
2852 fn test_either_into_inner() {
2853 fn ret_either(a: u32, b: u32, c: bool) -> Either<u32, u32> {
2854 if c { Either::A(a) } else { Either::B(b) }
2855 }
2856
2857 assert_eq!(ret_either(1, 2, true).into_inner(), 1);
2858 assert_eq!(ret_either(1, 2, false).into_inner(), 2);
2859 }
2860
2861 #[test]
2862 fn test_either_unwrap_success() {
2863 assert_eq!(Either::<u16, u32>::A(5).unwrap_a(), 5);
2864 assert_eq!(Either::<u16, u32>::B(10).unwrap_b(), 10);
2865 }
2866
2867 #[test]
2868 #[should_panic]
2869 fn test_either_unwrap_a_panic() {
2870 let _: u16 = Either::<u16, u32>::B(10).unwrap_a();
2871 }
2872
2873 #[test]
2874 #[should_panic]
2875 fn test_either_unwrap_b_panic() {
2876 let _: u32 = Either::<u16, u32>::A(5).unwrap_b();
2877 }
2878
2879 #[test_case(Buf::new((0..100).collect(), ..); "entire buf")]
2880 #[test_case(Buf::new((0..100).collect(), 0..0); "empty range")]
2881 #[test_case(Buf::new((0..100).collect(), ..50); "prefix")]
2882 #[test_case(Buf::new((0..100).collect(), 50..); "suffix")]
2883 #[test_case(Buf::new((0..100).collect(), 25..75); "middle")]
2884 fn test_buf_into_inner(buf: Buf<Vec<u8>>) {
2885 assert_eq!(buf.clone().as_ref(), buf.into_inner());
2886 }
2887
2888 #[test]
2889 fn test_packet_constraints() {
2890 use PacketConstraints as PC;
2891
2892 assert!(PC::try_new(0, 0, 0, 0).is_some());
2896 assert!(PC::try_new(usize::MAX / 2, usize::MAX / 2, 0, 0).is_some());
2898 assert_eq!(PC::try_new(usize::MAX, 1, 0, 0), None);
2900 assert_eq!(PC::try_new(0, 0, 1, 0), None);
2902
2903 let pc = PC::new(10, 10, 0, usize::MAX);
2907 assert_eq!(pc.try_encapsulate(&pc).unwrap(), PC::new(20, 20, 0, usize::MAX - 20));
2908
2909 let pc = PC::new(10, 10, 0, usize::MAX);
2910 assert_eq!(pc.try_encapsulate(&pc).unwrap(), PC::new(20, 20, 0, usize::MAX - 20));
2911
2912 let inner = PC::new(10, 10, 0, usize::MAX);
2923 let outer = PC::new(0, 0, 10, usize::MAX);
2924 assert_eq!(inner.try_encapsulate(&outer).unwrap(), PC::new(10, 10, 0, usize::MAX - 20));
2925
2926 let inner = PC::new(usize::MAX, 0, 0, usize::MAX);
2930 let outer = PC::new(1, 0, 0, usize::MAX);
2931 assert_eq!(inner.try_encapsulate(&outer), None);
2932
2933 let inner = PC::new(0, usize::MAX, 0, usize::MAX);
2937 let outer = PC::new(0, 1, 0, usize::MAX);
2938 assert_eq!(inner.try_encapsulate(&outer), None);
2939
2940 let one_fifth_max = (usize::MAX / 5) + 1;
2947 let inner = PC::new(one_fifth_max, one_fifth_max, one_fifth_max, usize::MAX);
2948 let outer = PC::new(one_fifth_max, one_fifth_max, 0, usize::MAX);
2949 assert_eq!(inner.try_encapsulate(&outer), None);
2950
2951 let inner = PC::new(10, 10, 0, usize::MAX);
2956 let outer = PC::new(0, 0, 0, 10);
2957 assert_eq!(inner.try_encapsulate(&outer), None);
2958
2959 let inner = PC::new(0, 0, 10, usize::MAX);
2965 let outer = PC::new(0, 0, 0, 5);
2966 assert_eq!(inner.try_encapsulate(&outer), None);
2967 }
2968
2969 #[test]
2970 fn test_inner_serializer() {
2971 const INNER: &[u8] = &[0, 1, 2, 3, 4, 5, 6, 7, 8, 9];
2972
2973 fn concat<'a, I: IntoIterator<Item = &'a &'a [u8]>>(slices: I) -> Vec<u8> {
2974 let mut v = Vec::new();
2975 for slc in slices.into_iter() {
2976 v.extend_from_slice(slc);
2977 }
2978 v
2979 }
2980
2981 let buf =
2983 INNER.into_serializer().serialize_vec_outer(&mut NoOpSerializationContext).unwrap();
2984 assert_eq!(buf.as_ref(), INNER);
2985
2986 let buf = INNER
2989 .into_serializer()
2990 .into_verifying(false)
2991 .wrap_in(DummyPacketBuilder::new(0, 0, 20, usize::MAX))
2992 .serialize_vec_outer(&mut NoOpSerializationContext)
2993 .unwrap();
2994 assert_eq!(buf.as_ref(), concat(&[INNER, vec![0; 10].as_ref()]).as_slice());
2995
2996 let buf = INNER
3000 .into_serializer()
3001 .into_verifying(false)
3002 .wrap_in(DummyPacketBuilder::new(10, 10, 0, usize::MAX))
3003 .serialize_vec_outer(&mut NoOpSerializationContext)
3004 .unwrap();
3005 assert_eq!(
3006 buf.as_ref(),
3007 concat(&[vec![0xFF; 10].as_ref(), INNER, vec![0xFE; 10].as_ref()]).as_slice()
3008 );
3009
3010 assert_eq!(
3012 INNER
3013 .into_serializer()
3014 .into_verifying(false)
3015 .wrap_in(DummyPacketBuilder::new(0, 0, 0, 9))
3016 .serialize_vec_outer(&mut NoOpSerializationContext)
3017 .unwrap_err()
3018 .0,
3019 SerializeError::SizeLimitExceeded
3020 );
3021
3022 assert_eq!(
3026 INNER
3027 .into_serializer_with(Buf::new(vec![0xFF], ..))
3028 .into_verifying(false)
3029 .serialize_vec_outer(&mut NoOpSerializationContext)
3030 .unwrap()
3031 .as_ref(),
3032 INNER
3033 );
3034 }
3035
3036 #[test]
3037 fn test_buffer_serializer_and_inner_serializer() {
3038 fn verify_buffer_serializer<B: BufferMut + Debug>(
3039 buffer: B,
3040 header_len: usize,
3041 footer_len: usize,
3042 min_body_len: usize,
3043 ) {
3044 let old_body = buffer.to_flattened_vec();
3045 let serializer =
3046 DummyPacketBuilder::new(header_len, footer_len, min_body_len, usize::MAX)
3047 .wrap_body(buffer);
3048
3049 let buffer0 = serializer
3050 .serialize_new_buf(
3051 &mut NoOpSerializationContext,
3052 PacketConstraints::UNCONSTRAINED,
3053 dirty_buf_alloc,
3054 )
3055 .unwrap();
3056 verify(buffer0, &old_body, header_len, footer_len, min_body_len);
3057
3058 let buffer = serializer.serialize_vec_outer(&mut NoOpSerializationContext).unwrap();
3059 verify(buffer, &old_body, header_len, footer_len, min_body_len);
3060 }
3061
3062 fn verify_inner_packet_builder_serializer(
3063 body: &[u8],
3064 header_len: usize,
3065 footer_len: usize,
3066 min_body_len: usize,
3067 ) {
3068 let buffer = DummyPacketBuilder::new(header_len, footer_len, min_body_len, usize::MAX)
3069 .wrap_body(body.into_serializer())
3070 .serialize_vec_outer(&mut NoOpSerializationContext)
3071 .unwrap();
3072 verify(buffer, body, header_len, footer_len, min_body_len);
3073 }
3074
3075 fn verify<B: Buffer>(
3076 buffer: B,
3077 body: &[u8],
3078 header_len: usize,
3079 footer_len: usize,
3080 min_body_len: usize,
3081 ) {
3082 let flat = buffer.to_flattened_vec();
3083 let header_bytes = &flat[..header_len];
3084 let body_bytes = &flat[header_len..header_len + body.len()];
3085 let padding_len = min_body_len.saturating_sub(body.len());
3086 let padding_bytes =
3087 &flat[header_len + body.len()..header_len + body.len() + padding_len];
3088 let total_body_len = body.len() + padding_len;
3089 let footer_bytes = &flat[header_len + total_body_len..];
3090 assert_eq!(
3091 buffer.len() - total_body_len,
3092 header_len + footer_len,
3093 "buffer.len()({}) - total_body_len({}) != header_len({}) + footer_len({})",
3094 buffer.len(),
3095 header_len,
3096 footer_len,
3097 min_body_len,
3098 );
3099
3100 assert!(
3102 header_bytes.iter().all(|b| *b == 0xFF),
3103 "header_bytes {:?} are not filled with 0xFF's",
3104 header_bytes,
3105 );
3106 assert_eq!(body_bytes, body);
3107 assert!(
3109 padding_bytes.iter().all(|b| *b == 0),
3110 "padding_bytes {:?} are not filled with 0s",
3111 padding_bytes,
3112 );
3113 assert!(
3115 footer_bytes.iter().all(|b| *b == 0xFE),
3116 "footer_bytes {:?} are not filled with 0xFE's",
3117 footer_bytes,
3118 );
3119 }
3120
3121 for buf_len in 0..8 {
3124 for range_start in 0..buf_len {
3125 for range_end in range_start..buf_len {
3126 for prefix in 0..8 {
3127 for suffix in 0..8 {
3128 for min_body in 0..8 {
3129 let mut vec = vec![0; buf_len];
3130 #[allow(clippy::needless_range_loop)]
3135 for i in 0..vec.len() {
3136 vec[i] = i as u8;
3137 }
3138 verify_buffer_serializer(
3139 Buf::new(vec.as_mut_slice(), range_start..range_end),
3140 prefix,
3141 suffix,
3142 min_body,
3143 );
3144 if range_start == 0 {
3145 verify_inner_packet_builder_serializer(
3154 &vec.as_slice()[range_start..range_end],
3155 prefix,
3156 suffix,
3157 min_body,
3158 );
3159 }
3160 }
3161 }
3162 }
3163 }
3164 }
3165 }
3166 }
3167
3168 #[test]
3169 fn test_min_body_len() {
3170 let body = &[1, 2];
3175
3176 let inner = DummyPacketBuilder::new(2, 2, 0, usize::MAX);
3179 let outer = DummyPacketBuilder::new(2, 2, 8, usize::MAX);
3181 let buf = body
3182 .into_serializer()
3183 .into_verifying(false)
3184 .wrap_in_verifying(inner, false)
3185 .wrap_in_verifying(outer, false)
3186 .serialize_vec_outer(&mut NoOpSerializationContext)
3187 .unwrap();
3188 assert_eq!(buf.prefix_len(), 0);
3189 assert_eq!(buf.suffix_len(), 0);
3190 assert_eq!(
3191 buf.as_ref(),
3192 &[
3193 0xFF, 0xFF, 0xFF, 0xFF, 1, 2, 0xFE, 0xFE, 0, 0, 0xFE, 0xFE ]
3200 );
3201 }
3202
3203 #[test]
3204 fn test_size_limit() {
3205 fn test<S: Serializer<NoOpSerializationContext> + Clone + Debug + Eq>(ser: S)
3207 where
3208 S::Buffer: ReusableBuffer,
3209 {
3210 let pb = DummyPacketBuilder::new(1, 1, 0, usize::MAX);
3216
3217 assert!(
3222 ser.clone()
3223 .wrap_in_verifying(pb, false)
3224 .with_size_limit_verifying(3, false)
3225 .serialize_vec_outer(&mut NoOpSerializationContext)
3226 .is_ok()
3227 );
3228 assert!(
3230 ser.clone()
3231 .wrap_in_verifying(pb, false)
3232 .with_size_limit_verifying(4, false)
3233 .serialize_vec_outer(&mut NoOpSerializationContext)
3234 .is_ok()
3235 );
3236 assert!(
3240 ser.clone()
3241 .with_size_limit_verifying(1, false)
3242 .wrap_in_verifying(pb, false)
3243 .with_size_limit_verifying(3, false)
3244 .serialize_vec_outer(&mut NoOpSerializationContext)
3245 .is_ok()
3246 );
3247 assert!(
3250 ser.clone()
3251 .with_size_limit_verifying(0, false)
3252 .wrap_in_verifying(pb, false)
3253 .serialize_vec_outer(&mut NoOpSerializationContext)
3254 .is_err()
3255 );
3256 assert!(
3262 ser.clone()
3263 .wrap_in_verifying(pb, false)
3264 .with_size_limit_verifying(1, false)
3265 .serialize_vec_outer(&mut NoOpSerializationContext)
3266 .is_err()
3267 );
3268 }
3269
3270 test(DummyPacketBuilder::new(1, 0, 0, usize::MAX).into_serializer().into_verifying(false));
3272 test(Buf::new(vec![0], ..).into_verifying(false));
3273 }
3274
3275 #[test]
3276 fn test_truncating_serializer() {
3277 fn verify_result<S: Serializer<NoOpSerializationContext> + Debug>(ser: S, expected: &[u8])
3278 where
3279 S::Buffer: ReusableBuffer + AsRef<[u8]>,
3280 {
3281 let buf = ser
3282 .serialize_new_buf(
3283 &mut NoOpSerializationContext,
3284 PacketConstraints::UNCONSTRAINED,
3285 new_buf_vec,
3286 )
3287 .unwrap();
3288 assert_eq!(buf.as_ref(), &expected[..]);
3289 let buf = ser.serialize_vec_outer(&mut NoOpSerializationContext).unwrap();
3290 assert_eq!(buf.as_ref(), &expected[..]);
3291 }
3292
3293 let body = vec![0, 1, 2, 3, 4, 5, 6, 7, 8, 9];
3295 let ser =
3296 TruncatingSerializer::new(Buf::new(body.clone(), ..), TruncateDirection::DiscardFront)
3297 .into_verifying(true)
3298 .with_size_limit_verifying(4, true);
3299 verify_result(ser, &[6, 7, 8, 9]);
3300
3301 let ser =
3303 TruncatingSerializer::new(Buf::new(body.clone(), ..), TruncateDirection::DiscardBack)
3304 .into_verifying(true)
3305 .with_size_limit_verifying(7, true);
3306 verify_result(ser, &[0, 1, 2, 3, 4, 5, 6]);
3307
3308 let ser =
3310 TruncatingSerializer::new(Buf::new(body.clone(), ..), TruncateDirection::NoTruncating)
3311 .into_verifying(false)
3312 .with_size_limit_verifying(5, true);
3313 assert!(ser.clone().serialize_vec_outer(&mut NoOpSerializationContext).is_err());
3314 assert!(
3315 ser.serialize_new_buf(
3316 &mut NoOpSerializationContext,
3317 PacketConstraints::UNCONSTRAINED,
3318 new_buf_vec
3319 )
3320 .is_err()
3321 );
3322 assert!(ser.serialize_vec_outer(&mut NoOpSerializationContext).is_err());
3323
3324 fn test_serialization_failure<
3328 S: Serializer<NoOpSerializationContext> + Clone + Eq + Debug,
3329 >(
3330 ser: S,
3331 err: SerializeError<BufferTooShortError>,
3332 ) where
3333 S::Buffer: ReusableBuffer + Debug,
3334 {
3335 let (e, new_ser) = DummyPacketBuilder::new(2, 2, 0, 1)
3344 .wrap_body(ser.clone())
3345 .serialize_no_alloc_outer(&mut NoOpSerializationContext)
3346 .unwrap_err();
3347 assert_eq!(err, e);
3348 assert_eq!(new_ser.into_inner(), ser);
3349 }
3350
3351 let body = Buf::new(vec![1, 2], ..);
3352 test_serialization_failure(
3353 TruncatingSerializer::new(body.clone(), TruncateDirection::DiscardFront)
3354 .into_verifying(true),
3355 SerializeError::Alloc(BufferTooShortError),
3356 );
3357 test_serialization_failure(
3358 TruncatingSerializer::new(body.clone(), TruncateDirection::DiscardFront)
3359 .into_verifying(true),
3360 SerializeError::Alloc(BufferTooShortError),
3361 );
3362 test_serialization_failure(
3363 TruncatingSerializer::new(body.clone(), TruncateDirection::NoTruncating)
3364 .into_verifying(false),
3365 SerializeError::SizeLimitExceeded,
3366 );
3367 }
3368
3369 #[test]
3374 fn nested_partial_serialize_constraints() {
3375 const BODY: &[u8] = &[0, 1, 2, 3, 4, 5, 6, 7, 8, 9];
3376 const INNER_PACKET_MAX_BODY: usize = 10;
3377 const EXPECTED_HEADER: &[u8] = &[0xFF; 20];
3378
3379 let packet = BODY
3380 .into_serializer()
3381 .wrap_in(DummyPacketBuilder::new(0, 0, 0, INNER_PACKET_MAX_BODY))
3382 .wrap_in(DummyPacketBuilder::new(2 * INNER_PACKET_MAX_BODY, 0, 0, usize::MAX));
3383 let result = packet.partial_serialize(&mut NoOpSerializationContext, new_buf_vec);
3384 let buffer = assert_matches!(
3385 result,
3386 Ok(PartialSerializeResult::NewBuffer { buffer, total_size: 30 }) => buffer);
3387 assert_eq!(buffer.as_ref(), EXPECTED_HEADER);
3388 }
3389
3390 #[test]
3391 fn test_try_reuse_buffer() {
3392 fn test_expect_success(
3393 body_range: Range<usize>,
3394 prefix: usize,
3395 suffix: usize,
3396 max_copy_bytes: usize,
3397 ) {
3398 let mut bytes = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9];
3399 let buffer = Buf::new(&mut bytes[..], body_range);
3400 let body = buffer.as_ref().to_vec();
3401 let buffer = try_reuse_buffer(buffer, prefix, suffix, max_copy_bytes).unwrap();
3402 assert_eq!(buffer.as_ref(), body.as_slice());
3403 assert!(buffer.prefix_len() >= prefix);
3404 assert!(buffer.suffix_len() >= suffix);
3405 }
3406
3407 fn test_expect_failure(
3408 body_range: Range<usize>,
3409 prefix: usize,
3410 suffix: usize,
3411 max_copy_bytes: usize,
3412 ) {
3413 let mut bytes = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9];
3414 let buffer = Buf::new(&mut bytes[..], body_range.clone());
3415 let mut bytes = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9];
3416 let orig = Buf::new(&mut bytes[..], body_range.clone());
3417 let buffer = try_reuse_buffer(buffer, prefix, suffix, max_copy_bytes).unwrap_err();
3418 assert_eq!(buffer, orig);
3419 }
3420
3421 test_expect_success(0..10, 0, 0, 0);
3423 test_expect_success(1..9, 1, 1, 0);
3425 test_expect_success(0..9, 1, 0, 9);
3428 test_expect_success(1..10, 0, 1, 9);
3429 test_expect_failure(0..9, 1, 0, 8);
3431 test_expect_failure(1..10, 0, 1, 8);
3432 }
3433
3434 #[test]
3435 fn test_maybe_reuse_buffer_provider() {
3436 fn test_expect(body_range: Range<usize>, prefix: usize, suffix: usize, expect_a: bool) {
3437 let mut bytes = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9];
3438 let buffer = Buf::new(&mut bytes[..], body_range);
3439 let body = buffer.as_ref().to_vec();
3440 let buffer = BufferProvider::reuse_or_realloc(
3441 MaybeReuseBufferProvider(new_buf_vec),
3442 buffer,
3443 prefix,
3444 suffix,
3445 )
3446 .unwrap();
3447 match &buffer {
3448 Either::A(_) if expect_a => {}
3449 Either::B(_) if !expect_a => {}
3450 Either::A(_) => panic!("expected Eitehr::B variant"),
3451 Either::B(_) => panic!("expected Eitehr::A variant"),
3452 }
3453 let bytes: &[u8] = buffer.as_ref();
3454 assert_eq!(bytes, body.as_slice());
3455 assert!(buffer.prefix_len() >= prefix);
3456 assert!(buffer.suffix_len() >= suffix);
3457 }
3458
3459 fn test_expect_reuse(body_range: Range<usize>, prefix: usize, suffix: usize) {
3461 test_expect(body_range, prefix, suffix, true);
3462 }
3463
3464 fn test_expect_realloc(body_range: Range<usize>, prefix: usize, suffix: usize) {
3466 test_expect(body_range, prefix, suffix, false);
3467 }
3468
3469 test_expect_reuse(0..10, 0, 0);
3471 test_expect_reuse(1..9, 1, 1);
3473 test_expect_reuse(0..9, 1, 0);
3476 test_expect_reuse(1..10, 0, 1);
3477 test_expect_realloc(0..9, 1, 1);
3479 test_expect_realloc(1..10, 1, 1);
3480 }
3481
3482 #[test]
3483 fn test_no_reuse_buffer_provider() {
3484 #[track_caller]
3485 fn test_expect(body_range: Range<usize>, prefix: usize, suffix: usize) {
3486 let mut bytes = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9];
3487 let internal_buffer: Buf<&mut [u8]> = Buf::new(&mut bytes[..], body_range);
3489 let body = internal_buffer.as_ref().to_vec();
3490 let buffer: Buf<Vec<u8>> = BufferProvider::reuse_or_realloc(
3493 NoReuseBufferProvider(new_buf_vec),
3494 internal_buffer,
3495 prefix,
3496 suffix,
3497 )
3498 .unwrap();
3499 let bytes: &[u8] = buffer.as_ref();
3500 assert_eq!(bytes, body.as_slice());
3501 assert_eq!(buffer.prefix_len(), prefix);
3502 assert_eq!(buffer.suffix_len(), suffix);
3503 }
3504 test_expect(0..10, 0, 0);
3506 test_expect(1..9, 1, 1);
3508 test_expect(0..9, 10, 10);
3510 test_expect(1..10, 15, 15);
3511 }
3512
3513 struct ScatterGatherBuf<B> {
3537 data: Vec<u8>,
3538 mid: usize,
3539 range: Range<usize>,
3540 inner: B,
3541 }
3542
3543 impl<B: BufferMut> FragmentedBuffer for ScatterGatherBuf<B> {
3544 fn len(&self) -> usize {
3545 self.inner.len() + (self.range.end - self.range.start)
3546 }
3547
3548 fn with_bytes<'a, R, F>(&'a self, f: F) -> R
3549 where
3550 F: for<'b> FnOnce(FragmentedBytes<'b, 'a>) -> R,
3551 {
3552 let (_, rest) = self.data.split_at(self.range.start);
3553 let (prefix_b, rest) = rest.split_at(self.mid - self.range.start);
3554 let (suffix_b, _) = rest.split_at(self.range.end - self.mid);
3555 let mut bytes = [prefix_b, self.inner.as_ref(), suffix_b];
3556 f(FragmentedBytes::new(&mut bytes[..]))
3557 }
3558 }
3559
3560 impl<B: BufferMut> FragmentedBufferMut for ScatterGatherBuf<B> {
3561 fn with_bytes_mut<'a, R, F>(&'a mut self, f: F) -> R
3562 where
3563 F: for<'b> FnOnce(FragmentedBytesMut<'b, 'a>) -> R,
3564 {
3565 let (_, rest) = self.data.split_at_mut(self.range.start);
3566 let (prefix_b, rest) = rest.split_at_mut(self.mid - self.range.start);
3567 let (suffix_b, _) = rest.split_at_mut(self.range.end - self.mid);
3568 let mut bytes = [prefix_b, self.inner.as_mut(), suffix_b];
3569 f(FragmentedBytesMut::new(&mut bytes[..]))
3570 }
3571 }
3572
3573 impl<B: BufferMut> GrowBuffer for ScatterGatherBuf<B> {
3574 fn with_parts<'a, O, F>(&'a self, f: F) -> O
3575 where
3576 F: for<'b> FnOnce(&'a [u8], FragmentedBytes<'b, 'a>, &'a [u8]) -> O,
3577 {
3578 let (prefix, rest) = self.data.split_at(self.range.start);
3579 let (prefix_b, rest) = rest.split_at(self.mid - self.range.start);
3580 let (suffix_b, suffix) = rest.split_at(self.range.end - self.mid);
3581 let mut bytes = [prefix_b, self.inner.as_ref(), suffix_b];
3582 f(prefix, bytes.as_fragmented_byte_slice(), suffix)
3583 }
3584 fn prefix_len(&self) -> usize {
3585 self.range.start
3586 }
3587
3588 fn suffix_len(&self) -> usize {
3589 self.data.len() - self.range.end
3590 }
3591
3592 fn grow_front(&mut self, n: usize) {
3593 self.range.start -= n;
3594 }
3595
3596 fn grow_back(&mut self, n: usize) {
3597 self.range.end += n;
3598 assert!(self.range.end <= self.data.len());
3599 }
3600 }
3601
3602 impl<B: BufferMut> GrowBufferMut for ScatterGatherBuf<B> {
3603 fn with_parts_mut<'a, O, F>(&'a mut self, f: F) -> O
3604 where
3605 F: for<'b> FnOnce(&'a mut [u8], FragmentedBytesMut<'b, 'a>, &'a mut [u8]) -> O,
3606 {
3607 let (prefix, rest) = self.data.split_at_mut(self.range.start);
3608 let (prefix_b, rest) = rest.split_at_mut(self.mid - self.range.start);
3609 let (suffix_b, suffix) = rest.split_at_mut(self.range.end - self.mid);
3610 let mut bytes = [prefix_b, self.inner.as_mut(), suffix_b];
3611 f(prefix, bytes.as_fragmented_byte_slice(), suffix)
3612 }
3613
3614 fn with_all_contents_mut<'a, O, F>(&'a mut self, _f: F) -> O
3615 where
3616 F: for<'b> FnOnce(FragmentedBytesMut<'b, 'a>) -> O,
3617 {
3618 unimplemented!()
3619 }
3620 }
3621
3622 struct ScatterGatherProvider;
3623
3624 impl<B: BufferMut> BufferProvider<B, ScatterGatherBuf<B>> for ScatterGatherProvider {
3625 type Error = Never;
3626
3627 fn alloc_no_reuse(
3628 self,
3629 _prefix: usize,
3630 _body: usize,
3631 _suffix: usize,
3632 ) -> Result<ScatterGatherBuf<B>, Self::Error> {
3633 unimplemented!("not used in tests")
3634 }
3635
3636 fn reuse_or_realloc(
3637 self,
3638 buffer: B,
3639 prefix: usize,
3640 suffix: usize,
3641 ) -> Result<ScatterGatherBuf<B>, (Self::Error, B)> {
3642 let inner = buffer;
3643 let data = vec![0; prefix + suffix];
3644 let range = Range { start: prefix, end: prefix };
3645 let mid = prefix;
3646 Ok(ScatterGatherBuf { inner, data, range, mid })
3647 }
3648 }
3649
3650 #[test]
3651 fn test_scatter_gather_serialize() {
3652 let buf = Buf::new(vec![10, 20, 30, 40, 50], ..);
3655 let pb = DummyPacketBuilder::new(3, 2, 0, usize::MAX);
3656 let ser = pb.wrap_body(buf);
3657 let result =
3658 ser.serialize_outer(&mut NoOpSerializationContext, ScatterGatherProvider {}).unwrap();
3659 let flattened = result.to_flattened_vec();
3660 assert_eq!(&flattened[..], &[0xFF, 0xFF, 0xFF, 10, 20, 30, 40, 50, 0xFE, 0xFE]);
3661 }
3662
3663 #[test]
3664 fn dyn_serialize() {
3665 let body = Buf::new(vec![10, 20, 30, 40, 50], ..);
3666 let header1 = DummyPacketBuilder {
3667 header_len: 5,
3668 footer_len: 0,
3669 min_body_len: 0,
3670 max_body_len: usize::MAX,
3671 header_byte: 0xAA,
3672 footer_byte: 0xBB,
3673 };
3674 let header2 = DummyPacketBuilder {
3675 header_len: 3,
3676 footer_len: 2,
3677 min_body_len: 0,
3678 max_body_len: usize::MAX,
3679 header_byte: 0xCC,
3680 footer_byte: 0xDD,
3681 };
3682 let ser1 = body.clone().wrap_in(header1).wrap_in(header2);
3684 let ser2 = body.wrap_in(header1);
3686 let ser2 = DynSerializer::new(&ser2).wrap_in(header2);
3687 let ser3 = ser1.clone();
3689 let ser3 = DynSerializer::new(&ser3);
3690 let ser4 = DynSerializer::new(&ser2);
3692
3693 fn serialize(
3694 s: impl Serializer<NoOpSerializationContext, Buffer: ReusableBuffer>,
3695 ) -> Vec<u8> {
3696 s.serialize_vec(&mut NoOpSerializationContext, PacketConstraints::UNCONSTRAINED)
3697 .map_err(|(e, _)| e)
3698 .unwrap()
3699 .unwrap_b()
3700 .into_inner()
3701 }
3702
3703 fn serialize_new(s: impl Serializer<NoOpSerializationContext>) -> Vec<u8> {
3704 s.serialize_new_buf(
3705 &mut NoOpSerializationContext,
3706 PacketConstraints::UNCONSTRAINED,
3707 new_buf_vec,
3708 )
3709 .unwrap()
3710 .into_inner()
3711 }
3712
3713 let expect = serialize(ser1.clone());
3714 assert_eq!(serialize(ser2), expect);
3715 assert_eq!(serialize(ser3), expect);
3716 assert_eq!(serialize(ser4), expect);
3717 assert_eq!(serialize_new(ser1), expect);
3718 assert_eq!(serialize_new(ser2), expect);
3719 assert_eq!(serialize_new(ser3), expect);
3720 assert_eq!(serialize_new(ser4), expect);
3721 }
3722
3723 struct TrackingSerializationContext {
3726 history: Vec<usize>,
3727 }
3728
3729 impl SerializationContext for TrackingSerializationContext {
3730 type ContextState = ();
3731
3732 fn serialize_nested<O: PacketBuilder<Self>, R>(
3733 &mut self,
3734 outer: &O,
3735 constraints: PacketConstraints,
3736 serialize_fn: impl FnOnce(&mut Self, PacketConstraints) -> R,
3737 ) -> R {
3738 self.history.push(outer.constraints().header_len());
3739 serialize_fn(self, constraints)
3740 }
3741 }
3742
3743 #[test]
3744 fn nested_serializer_context_aware() {
3745 let body = Buf::new(vec![0; 10], ..);
3746
3747 let outer = DummyPacketBuilder::new(3, 0, 0, usize::MAX);
3748 let middle = DummyPacketBuilder::new(2, 0, 0, usize::MAX);
3749 let inner = DummyPacketBuilder::new(1, 0, 0, usize::MAX);
3750
3751 let serializer = body.wrap_in(inner).wrap_in(middle).wrap_in(outer);
3752
3753 let mut context = TrackingSerializationContext { history: Vec::new() };
3754 let _buf = serializer.clone().serialize_vec_outer(&mut context).unwrap();
3755 assert_eq!(context.history, vec![3, 2, 1]);
3756
3757 let mut context = TrackingSerializationContext { history: Vec::new() };
3758 let _buf = serializer
3759 .serialize_new_buf(&mut context, PacketConstraints::UNCONSTRAINED, new_buf_vec)
3760 .unwrap();
3761 assert_eq!(context.history, vec![3, 2, 1]);
3762 }
3763
3764 #[test]
3765 fn nested_partial_serializer_context_aware() {
3766 let body = Buf::new(vec![0; 10], ..);
3767
3768 let outer = DummyPacketBuilder::new(3, 0, 0, usize::MAX);
3769 let middle = DummyPacketBuilder::new(2, 0, 0, usize::MAX);
3770 let inner = DummyPacketBuilder::new(1, 0, 0, usize::MAX);
3771
3772 let serializer = body.wrap_in(inner).wrap_in(middle).wrap_in(outer);
3773
3774 let mut context = TrackingSerializationContext { history: Vec::new() };
3775 let _result = serializer.partial_serialize(&mut context, new_buf_vec).unwrap();
3776 assert_eq!(context.history, vec![3, 2, 1]);
3777 }
3778}