drt_sc_codec/single/
top_en_output.rs1use crate::{
2 num_conv::{top_encode_number, top_encode_number_buffer},
3 EncodeError, EncodeErrorHandler, NestedEncodeOutput, TryStaticCast,
4};
5use alloc::vec::Vec;
6
7pub trait TopEncodeOutput: Sized {
18 type NestedBuffer: NestedEncodeOutput;
20
21 fn set_slice_u8(self, bytes: &[u8]);
22
23 fn set_u64(self, value: u64) {
24 let mut buffer = top_encode_number_buffer();
25 let slice = top_encode_number(value, false, &mut buffer);
26 self.set_slice_u8(slice);
27 }
28
29 fn set_i64(self, value: i64) {
30 let mut buffer = top_encode_number_buffer();
31 let slice = top_encode_number(value as u64, true, &mut buffer);
32 self.set_slice_u8(slice);
33 }
34
35 #[doc(hidden)]
38 #[inline]
39 fn set_unit(self) {
40 self.set_slice_u8(&[]);
41 }
42
43 #[inline]
44 fn supports_specialized_type<T: TryStaticCast>() -> bool {
45 false
46 }
47
48 #[inline]
53 fn set_specialized<T, H>(self, _value: &T, h: H) -> Result<(), H::HandledErr>
54 where
55 T: TryStaticCast,
56 H: EncodeErrorHandler,
57 {
58 Err(h.handle_error(EncodeError::UNSUPPORTED_OPERATION))
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}