multiversx_sc/storage/
storage_key.rs

1use unwrap_infallible::UnwrapInfallible;
2
3use crate::{
4    api::{ErrorApi, ManagedTypeApi},
5    codec::*,
6    contract_base::ExitCodecErrorHandler,
7    types::{ManagedBuffer, ManagedByteArray, ManagedType, heap::BoxedBytes},
8    *,
9};
10
11pub struct StorageKey<A>
12where
13    A: ManagedTypeApi + ErrorApi + 'static,
14{
15    pub(crate) buffer: ManagedBuffer<A>,
16}
17
18impl<A> ManagedType<A> for StorageKey<A>
19where
20    A: ManagedTypeApi + ErrorApi + 'static,
21{
22    type OwnHandle = A::ManagedBufferHandle;
23
24    #[inline]
25    unsafe fn from_handle(handle: A::ManagedBufferHandle) -> Self {
26        unsafe {
27            StorageKey {
28                buffer: ManagedBuffer::from_handle(handle),
29            }
30        }
31    }
32
33    fn get_handle(&self) -> A::ManagedBufferHandle {
34        self.buffer.get_handle()
35    }
36
37    unsafe fn forget_into_handle(self) -> Self::OwnHandle {
38        unsafe { self.buffer.forget_into_handle() }
39    }
40
41    fn transmute_from_handle_ref(handle_ref: &A::ManagedBufferHandle) -> &Self {
42        unsafe { core::mem::transmute(handle_ref) }
43    }
44
45    fn transmute_from_handle_ref_mut(handle_ref: &mut A::ManagedBufferHandle) -> &mut Self {
46        unsafe { core::mem::transmute(handle_ref) }
47    }
48}
49
50impl<A> StorageKey<A>
51where
52    A: ManagedTypeApi + ErrorApi + 'static,
53{
54    #[inline]
55    pub fn new(base_key: &[u8]) -> Self {
56        StorageKey {
57            buffer: ManagedBuffer::new_from_bytes(base_key),
58        }
59    }
60
61    #[inline]
62    pub fn append_bytes(&mut self, bytes: &[u8]) {
63        self.buffer.append_bytes(bytes);
64    }
65
66    #[inline]
67    pub fn append_managed_buffer(&mut self, buffer: &ManagedBuffer<A>) {
68        self.buffer.append(buffer);
69    }
70
71    pub fn append_item<T>(&mut self, item: &T)
72    where
73        T: NestedEncode,
74    {
75        item.dep_encode_or_handle_err(
76            &mut self.buffer,
77            ExitCodecErrorHandler::<A>::from(err_msg::STORAGE_KEY_ENCODE_ERROR),
78        )
79        .unwrap_infallible()
80    }
81
82    #[inline]
83    pub fn to_boxed_bytes(&self) -> BoxedBytes {
84        self.buffer.to_boxed_bytes()
85    }
86}
87
88impl<M: ManagedTypeApi> From<ManagedBuffer<M>> for StorageKey<M> {
89    #[inline]
90    fn from(buffer: ManagedBuffer<M>) -> Self {
91        StorageKey { buffer }
92    }
93}
94
95impl<M: ManagedTypeApi> From<&str> for StorageKey<M> {
96    #[inline]
97    fn from(s: &str) -> Self {
98        StorageKey {
99            buffer: ManagedBuffer::from(s),
100        }
101    }
102}
103
104impl<M, const N: usize> From<ManagedByteArray<M, N>> for StorageKey<M>
105where
106    M: ManagedTypeApi + ErrorApi,
107{
108    #[inline]
109    fn from(mba: ManagedByteArray<M, N>) -> Self {
110        StorageKey { buffer: mba.buffer }
111    }
112}
113
114impl<M: ManagedTypeApi> Clone for StorageKey<M> {
115    fn clone(&self) -> Self {
116        StorageKey {
117            buffer: self.buffer.clone(),
118        }
119    }
120}