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