use alloc::vec::Vec;
use codec::{Decode, Encode};
pub fn get<T: Decode + Sized>(key: &[u8]) -> Option<T> {
subsoil::io::storage::get(key).and_then(|val| {
Decode::decode(&mut &val[..]).map(Some).unwrap_or_else(|e| {
log::error!(
target: "runtime::storage",
"Corrupted state at `{}`: {:?}",
array_bytes::bytes2hex("0x", key),
e,
);
None
})
})
}
pub fn get_or_default<T: Decode + Sized + Default>(key: &[u8]) -> T {
get(key).unwrap_or_default()
}
pub fn get_or<T: Decode + Sized>(key: &[u8], default_value: T) -> T {
get(key).unwrap_or(default_value)
}
pub fn get_or_else<T: Decode + Sized, F: FnOnce() -> T>(key: &[u8], default_value: F) -> T {
get(key).unwrap_or_else(default_value)
}
pub fn put<T: Encode + ?Sized>(key: &[u8], value: &T) {
value.using_encoded(|slice| subsoil::io::storage::set(key, slice));
}
pub fn take<T: Decode + Sized>(key: &[u8]) -> Option<T> {
let r = get(key);
if r.is_some() {
kill(key);
}
r
}
pub fn take_or_default<T: Decode + Sized + Default>(key: &[u8]) -> T {
take(key).unwrap_or_default()
}
pub fn take_or<T: Decode + Sized>(key: &[u8], default_value: T) -> T {
take(key).unwrap_or(default_value)
}
pub fn take_or_else<T: Decode + Sized, F: FnOnce() -> T>(key: &[u8], default_value: F) -> T {
take(key).unwrap_or_else(default_value)
}
pub fn exists(key: &[u8]) -> bool {
subsoil::io::storage::exists(key)
}
pub fn kill(key: &[u8]) {
subsoil::io::storage::clear(key);
}
#[deprecated = "Use `clear_prefix` instead"]
pub fn kill_prefix(prefix: &[u8], limit: Option<u32>) -> subsoil::io::KillStorageResult {
subsoil::io::storage::clear_prefix(prefix, limit)
}
pub fn clear_prefix(
prefix: &[u8],
maybe_limit: Option<u32>,
_maybe_cursor: Option<&[u8]>,
) -> subsoil::io::MultiRemovalResults {
use subsoil::io::{KillStorageResult::*, MultiRemovalResults};
#[allow(deprecated)]
let (maybe_cursor, i) = match kill_prefix(prefix, maybe_limit) {
AllRemoved(i) => (None, i),
SomeRemaining(i) => (Some(prefix.to_vec()), i),
};
MultiRemovalResults { maybe_cursor, backend: i, unique: i, loops: i }
}
pub fn contains_prefixed_key(prefix: &[u8]) -> bool {
match subsoil::io::storage::next_key(prefix) {
Some(key) => key.starts_with(prefix),
None => false,
}
}
pub fn get_raw(key: &[u8]) -> Option<Vec<u8>> {
subsoil::io::storage::get(key).map(|value| value.to_vec())
}
pub fn put_raw(key: &[u8], value: &[u8]) {
subsoil::io::storage::set(key, value)
}