multiversx_sc/types/managed/codec_util/
managed_buffer_top_de_input.rs1use crate::{
2 api::ManagedTypeApi,
3 codec::{
4 try_execute_then_cast, DecodeError, DecodeErrorHandler, TopDecodeInput, TryStaticCast,
5 },
6 err_msg,
7 types::{BigInt, BigUint, ManagedBuffer},
8};
9use alloc::boxed::Box;
10
11use super::ManagedBufferNestedDecodeInput;
12
13impl<M> TopDecodeInput for ManagedBuffer<M>
14where
15 M: ManagedTypeApi,
16{
17 type NestedBuffer = ManagedBufferNestedDecodeInput<M>;
18
19 fn byte_len(&self) -> usize {
20 self.len()
21 }
22
23 fn into_boxed_slice_u8(self) -> Box<[u8]> {
24 self.to_boxed_bytes().into_box()
25 }
26
27 fn into_max_size_buffer<H, const MAX_LEN: usize>(
28 self,
29 buffer: &mut [u8; MAX_LEN],
30 h: H,
31 ) -> Result<&[u8], H::HandledErr>
32 where
33 H: DecodeErrorHandler,
34 {
35 let len = self.len();
36 if len > MAX_LEN {
37 return Err(h.handle_error(DecodeError::INPUT_TOO_LONG));
38 }
39 let byte_slice = &mut buffer[..len];
40 self.load_slice(0, byte_slice);
41 Ok(byte_slice)
42 }
43
44 fn into_max_size_buffer_align_right<H, const MAX_LEN: usize>(
45 self,
46 buffer: &mut [u8; MAX_LEN],
47 h: H,
48 ) -> Result<usize, H::HandledErr>
49 where
50 H: DecodeErrorHandler,
51 {
52 let len = self.len();
53 if len > MAX_LEN {
54 return Err(h.handle_error(DecodeError::INPUT_TOO_LONG));
55 }
56 unsafe {
57 let byte_slice = buffer.get_unchecked_mut(MAX_LEN - len..);
58 self.load_slice(0, byte_slice);
59 }
60 Ok(len)
61 }
62
63 fn into_i64<H>(self, h: H) -> Result<i64, H::HandledErr>
64 where
65 H: DecodeErrorHandler,
66 {
67 if let Some(value) = self.parse_as_i64() {
68 Ok(value)
69 } else {
70 Err(h.handle_error(err_msg::VALUE_TOO_LONG.into()))
71 }
72 }
73
74 fn into_u64<H>(self, h: H) -> Result<u64, H::HandledErr>
75 where
76 H: DecodeErrorHandler,
77 {
78 if let Some(value) = self.parse_as_u64() {
79 Ok(value)
80 } else {
81 Err(h.handle_error(err_msg::VALUE_TOO_LONG.into()))
82 }
83 }
84
85 #[inline]
86 fn supports_specialized_type<T: TryStaticCast>() -> bool {
87 T::type_eq::<ManagedBuffer<M>>() || T::type_eq::<BigUint<M>>() || T::type_eq::<BigInt<M>>()
88 }
89
90 #[inline]
91 fn into_specialized<T, H>(self, h: H) -> Result<T, H::HandledErr>
92 where
93 T: TryStaticCast,
94 H: DecodeErrorHandler,
95 {
96 if let Some(result) = try_execute_then_cast(|| self.clone()) {
97 Ok(result)
98 } else if let Some(result) = try_execute_then_cast(|| BigUint::from_bytes_be_buffer(&self))
99 {
100 Ok(result)
101 } else if let Some(result) =
102 try_execute_then_cast(|| BigInt::from_signed_bytes_be_buffer(&self))
103 {
104 Ok(result)
105 } else {
106 Err(h.handle_error(DecodeError::UNSUPPORTED_OPERATION))
107 }
108 }
109
110 fn into_nested_buffer(self) -> Self::NestedBuffer {
111 ManagedBufferNestedDecodeInput::new(self)
112 }
113}