multiversx_sc/types/managed/codec_util/
managed_buffer_top_de_input.rs

1use 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}