testnumbat_codec/
top_ser_output.rs1use crate::{
2 num_conv::top_encode_number_to_output, EncodeError, NestedEncodeOutput, TryStaticCast,
3};
4use alloc::{boxed::Box, vec::Vec};
5
6pub trait TopEncodeOutput: Sized {
17 type NestedBuffer: NestedEncodeOutput;
19
20 fn set_slice_u8(self, bytes: &[u8]);
21
22 #[inline]
23 #[allow(clippy::boxed_local)]
24 fn set_boxed_bytes(self, bytes: Box<[u8]>) {
25 self.set_slice_u8(&*bytes);
26 }
27
28 fn set_u64(self, value: u64) {
29 let mut buffer = Vec::<u8>::with_capacity(8);
30 top_encode_number_to_output(&mut buffer, value, false);
31 self.set_slice_u8(&buffer[..]);
32 }
33
34 fn set_i64(self, value: i64) {
35 let mut buffer = Vec::<u8>::with_capacity(8);
36 top_encode_number_to_output(&mut buffer, value as u64, true);
37 self.set_slice_u8(&buffer[..]);
38 }
39
40 #[doc(hidden)]
43 #[inline]
44 fn set_unit(self) {
45 self.set_slice_u8(&[]);
46 }
47
48 #[inline]
53 fn set_specialized<T, F>(self, _value: &T, else_serialization: F) -> Result<(), EncodeError>
54 where
55 T: TryStaticCast,
56 F: FnOnce(Self) -> Result<(), EncodeError>,
57 {
58 else_serialization(self)
59 }
60
61 fn start_nested_encode(&self) -> Self::NestedBuffer;
62
63 fn finalize_nested_encode(self, nb: Self::NestedBuffer);
64}
65
66impl TopEncodeOutput for &mut Vec<u8> {
67 type NestedBuffer = Vec<u8>;
68
69 fn set_slice_u8(self, bytes: &[u8]) {
70 self.extend_from_slice(bytes);
71 }
72
73 fn start_nested_encode(&self) -> Self::NestedBuffer {
74 Vec::<u8>::new()
75 }
76
77 fn finalize_nested_encode(self, nb: Self::NestedBuffer) {
78 *self = nb;
79 }
80}