numbat_codec/top_de_input.rs
1use crate::num_conv::bytes_to_number;
2use crate::transmute::vec_into_boxed_slice;
3use alloc::boxed::Box;
4use alloc::vec::Vec;
5
6/// Trait that abstracts away an underlying API for a top-level object deserializer.
7/// The underlying API can provide pre-parsed i64/u64 or pre-bundled boxed slices.
8pub trait TopDecodeInput: Sized {
9 /// Length of the underlying data, in bytes.
10 fn byte_len(&self) -> usize;
11
12 /// Provides the underlying data as an owned byte slice box.
13 /// Consumes the input object in the process.
14 fn into_boxed_slice_u8(self) -> Box<[u8]>;
15
16 /// Retrieves the underlying data as a pre-parsed u64.
17 /// Expected to panic if the conversion is not possible.
18 ///
19 /// Consumes the input object in the process.
20 fn into_u64(self) -> u64 {
21 bytes_to_number(&*self.into_boxed_slice_u8(), false)
22 }
23
24 /// Retrieves the underlying data as a pre-parsed i64.
25 /// Expected to panic if the conversion is not possible.
26 ///
27 /// Consumes the input object in the process.
28 fn into_i64(self) -> i64 {
29 bytes_to_number(&*self.into_boxed_slice_u8(), true) as i64
30 }
31
32 /// Unless you're developing numbat-wasm, please ignore.
33 ///
34 /// Shortcut for sending a BigInt managed by the API to the API directly via its handle.
35 ///
36 /// - AndesBigInt + finish API
37 /// - AndesBigInt + set storage
38 /// Not used for:
39 /// - RustBigInt
40 /// - async call
41 #[doc(hidden)]
42 #[inline]
43 fn try_get_big_int_handle(&self) -> (bool, i32) {
44 (false, -1)
45 }
46
47 /// Unless you're developing numbat-wasm, please ignore.
48 ///
49 /// Shortcut for sending a BigUint managed by the API to the API directly via its handle.
50 ///
51 /// Used for:
52 /// - AndesBigUint + finish API
53 /// - AndesBigUint + set storage
54 /// Not used for:
55 /// - RustBigUint
56 /// - async call
57 /// - anything else
58 ///
59 #[doc(hidden)]
60 #[inline]
61 fn try_get_big_uint_handle(&self) -> (bool, i32) {
62 (false, -1)
63 }
64}
65
66impl TopDecodeInput for Box<[u8]> {
67 fn byte_len(&self) -> usize {
68 self.len()
69 }
70
71 fn into_boxed_slice_u8(self) -> Box<[u8]> {
72 self
73 }
74}
75
76impl TopDecodeInput for Vec<u8> {
77 fn byte_len(&self) -> usize {
78 self.len()
79 }
80
81 fn into_boxed_slice_u8(self) -> Box<[u8]> {
82 vec_into_boxed_slice(self)
83 }
84}
85
86impl<'a> TopDecodeInput for &'a [u8] {
87 fn byte_len(&self) -> usize {
88 self.len()
89 }
90
91 fn into_boxed_slice_u8(self) -> Box<[u8]> {
92 Box::from(self)
93 }
94}