drt_sc/api/
endpoint_arg_api.rs

1use crate::{err_msg, types::heap::BoxedBytes};
2
3use super::{
4    const_handles, use_raw_handle, BigIntApiImpl, ErrorApi, ErrorApiImpl, HandleTypeInfo,
5    ManagedBufferApiImpl, ManagedTypeApi, ManagedTypeApiImpl,
6};
7
8pub trait EndpointArgumentApi: HandleTypeInfo {
9    type EndpointArgumentApiImpl: EndpointArgumentApiImpl
10        + HandleTypeInfo<
11            ManagedBufferHandle = Self::ManagedBufferHandle,
12            BigIntHandle = Self::BigIntHandle,
13            BigFloatHandle = Self::BigFloatHandle,
14            EllipticCurveHandle = Self::EllipticCurveHandle,
15        >;
16
17    fn argument_api_impl() -> Self::EndpointArgumentApiImpl;
18}
19
20/// Interface to only be used by code generated by the macros.
21/// The smart contract code doesn't have access to these methods directly.
22pub trait EndpointArgumentApiImpl: ErrorApi + ManagedTypeApi {
23    fn get_num_arguments(&self) -> i32;
24
25    fn load_argument_managed_buffer(&self, arg_index: i32, dest: Self::ManagedBufferHandle);
26
27    fn get_argument_len(&self, arg_index: i32) -> usize {
28        let mbuf_temp_1: Self::ManagedBufferHandle =
29            use_raw_handle(const_handles::MBUF_TEMPORARY_1);
30        self.load_argument_managed_buffer(arg_index, mbuf_temp_1.clone());
31        Self::managed_type_impl().mb_len(mbuf_temp_1)
32    }
33
34    fn get_argument_boxed_bytes(&self, arg_index: i32) -> BoxedBytes {
35        let mbuf_temp_1: Self::ManagedBufferHandle =
36            use_raw_handle(const_handles::MBUF_TEMPORARY_1);
37        self.load_argument_managed_buffer(arg_index, mbuf_temp_1.clone());
38        Self::managed_type_impl().mb_to_boxed_bytes(mbuf_temp_1)
39    }
40
41    fn load_argument_big_int_unsigned(&self, arg_index: i32, dest: Self::BigIntHandle) {
42        let mbuf_temp_1: Self::ManagedBufferHandle =
43            use_raw_handle(const_handles::MBUF_TEMPORARY_1);
44        self.load_argument_managed_buffer(arg_index, mbuf_temp_1.clone());
45        Self::managed_type_impl().mb_to_big_int_unsigned(mbuf_temp_1, dest);
46    }
47
48    fn load_argument_big_int_signed(&self, arg_index: i32, dest: Self::BigIntHandle) {
49        let mbuf_temp_1: Self::ManagedBufferHandle =
50            use_raw_handle(const_handles::MBUF_TEMPORARY_1);
51        self.load_argument_managed_buffer(arg_index, mbuf_temp_1.clone());
52        Self::managed_type_impl().mb_to_big_int_signed(mbuf_temp_1, dest);
53    }
54
55    fn get_argument_u64(&self, arg_index: i32) -> u64 {
56        // TODO: this implementation doesn't work for arguments > i64::MAX, fix it!
57        let big_int_temp_1: Self::BigIntHandle = use_raw_handle(const_handles::BIG_INT_TEMPORARY_1);
58        self.load_argument_big_int_unsigned(arg_index, big_int_temp_1.clone());
59        if let Some(value) = Self::managed_type_impl().bi_to_i64(big_int_temp_1) {
60            value as u64
61        } else {
62            Self::error_api_impl().signal_error(err_msg::ARG_OUT_OF_RANGE.as_bytes())
63        }
64    }
65
66    fn get_argument_i64(&self, arg_index: i32) -> i64 {
67        let big_int_temp_1: Self::BigIntHandle = use_raw_handle(const_handles::BIG_INT_TEMPORARY_1);
68        self.load_argument_big_int_signed(arg_index, big_int_temp_1.clone());
69        if let Some(value) = Self::managed_type_impl().bi_to_i64(big_int_temp_1) {
70            value
71        } else {
72            Self::error_api_impl().signal_error(err_msg::ARG_OUT_OF_RANGE.as_bytes())
73        }
74    }
75
76    fn load_callback_closure_buffer(&self, dest: Self::ManagedBufferHandle);
77}