multiversx_sc/storage/
storage_key.rs1use 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}