use sp_std::prelude::*;
use codec::{Encode, Decode};
pub fn get<T: Decode + Sized>(key: &[u8]) -> Option<T> {
sp_io::storage::get(key).and_then(|val| {
Decode::decode(&mut &val[..]).map(Some).unwrap_or_else(|_| {
runtime_print!("ERROR: Corrupted state at {:?}", key);
None
})
})
}
pub fn get_or_default<T: Decode + Sized + Default>(key: &[u8]) -> T {
get(key).unwrap_or_else(Default::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| sp_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_else(Default::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 {
sp_io::storage::read(key, &mut [0;0][..], 0).is_some()
}
pub fn kill(key: &[u8]) {
sp_io::storage::clear(key);
}
pub fn kill_prefix(prefix: &[u8]) {
sp_io::storage::clear_prefix(prefix);
}
pub fn get_raw(key: &[u8]) -> Option<Vec<u8>> {
sp_io::storage::get(key)
}
pub fn put_raw(key: &[u8], value: &[u8]) {
sp_io::storage::set(key, value)
}