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