1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66
use borsh::BorshSerialize;
/// Converts Self into a [`Vec<u8>`] that is used for a storage key through [`into_storage_key`].
///
/// [`into_storage_key`]: IntoStorageKey::into_storage_key
pub trait IntoStorageKey {
/// Consumes self and returns [`Vec<u8>`] bytes which are used as a storage key.
fn into_storage_key(self) -> Vec<u8>;
}
impl IntoStorageKey for Vec<u8> {
#[inline]
fn into_storage_key(self) -> Vec<u8> {
self
}
}
impl<'a> IntoStorageKey for &'a [u8] {
#[inline]
fn into_storage_key(self) -> Vec<u8> {
self.to_vec()
}
}
impl<'a> IntoStorageKey for &'a [u8; 1] {
#[inline]
fn into_storage_key(self) -> Vec<u8> {
self.to_vec()
}
}
impl IntoStorageKey for u8 {
#[inline]
fn into_storage_key(self) -> Vec<u8> {
vec![self]
}
}
/// Converts a Borsh serializable object into a `Vec<u8>` that is used for a storage key.
///
/// ```
/// use near_sdk::borsh::BorshSerialize;
/// use near_sdk::BorshIntoStorageKey;
/// use near_sdk::collections::LookupMap;
///
/// #[derive(BorshSerialize)]
/// enum StorageKey {
/// FungibleToken,
/// Metadata { sub_key: String },
/// }
///
/// impl BorshIntoStorageKey for StorageKey {}
///
/// let lookup_map_1: LookupMap<u64, String> = LookupMap::new(StorageKey::Metadata { sub_key: String::from("yo") });
/// let lookup_map_2: LookupMap<String, String> = LookupMap::new(StorageKey::FungibleToken);
/// ```
pub trait BorshIntoStorageKey: BorshSerialize {}
impl<T> IntoStorageKey for T
where
T: BorshIntoStorageKey,
{
fn into_storage_key(self) -> Vec<u8> {
self.try_to_vec().unwrap()
}
}