multiversx_sc/api/external_view/
ev_storage_api.rs1use crate::api::{
2 const_handles, managed_types::HandleConstraints, use_raw_handle, ManagedBufferApiImpl,
3 StaticVarApiImpl, StorageReadApi, StorageReadApiImpl, VMApi,
4};
5
6use super::ExternalViewApi;
7
8pub const EXTERNAL_VIEW_TARGET_ADDRESS_KEY: &[u8] = b"external-view-target-address";
9
10impl<A> StorageReadApi for ExternalViewApi<A>
11where
12 A: VMApi,
13{
14 type StorageReadApiImpl = ExternalViewApi<A>;
15
16 fn storage_read_api_impl() -> Self::StorageReadApiImpl {
17 ExternalViewApi::new()
18 }
19}
20
21impl<A> ExternalViewApi<A>
22where
23 A: VMApi,
24{
25 fn load_external_view_target_key_handle(&self) {
28 let external_view_target_key_handle: A::ManagedBufferHandle =
29 use_raw_handle(const_handles::MBUF_TEMPORARY_1);
30 A::managed_type_impl().mb_overwrite(
31 external_view_target_key_handle.clone(),
32 EXTERNAL_VIEW_TARGET_ADDRESS_KEY,
33 );
34 let external_view_target_address_handle: A::ManagedBufferHandle =
35 use_raw_handle(A::static_var_api_impl().next_handle());
36 A::storage_read_api_impl().storage_load_managed_buffer_raw(
37 external_view_target_key_handle,
38 external_view_target_address_handle.clone(),
39 );
40 A::static_var_api_impl().set_external_view_target_address_handle(
41 external_view_target_address_handle.get_raw_handle(),
42 );
43 }
44}
45
46impl<A: VMApi> StorageReadApiImpl for ExternalViewApi<A> {
47 fn storage_read_api_init(&self) {
48 self.load_external_view_target_key_handle();
49 }
50
51 fn storage_load_managed_buffer_raw(
52 &self,
53 key_handle: Self::ManagedBufferHandle,
54 dest: Self::ManagedBufferHandle,
55 ) {
56 let target_address_handle =
57 use_raw_handle(A::static_var_api_impl().get_external_view_target_address_handle());
58 A::storage_read_api_impl().storage_load_from_address(
59 target_address_handle,
60 key_handle,
61 dest,
62 );
63 }
64
65 fn storage_load_from_address(
66 &self,
67 address_handle: Self::ManagedBufferHandle,
68 key_handle: Self::ManagedBufferHandle,
69 dest: Self::ManagedBufferHandle,
70 ) {
71 A::storage_read_api_impl().storage_load_from_address(address_handle, key_handle, dest);
72 }
73}