use crate::runtime;
use scale::{Decode, Encode};
pub trait SpreadLayout {
fn read_ledger(key: &[u8], prefix: &[u8]) -> Self;
fn write_ledger(&self, key: &[u8], prefix: &[u8]);
}
impl<T> SpreadLayout for T where T: Encode + Decode + Default {
fn read_ledger(key: &[u8], _: &[u8]) -> Self {
match runtime::storage_read(key, "".as_bytes()) {
Some(value) => {
<T>::decode(&mut &value[..]).unwrap()
}
None => { Default::default() }
}
}
fn write_ledger(&self, key: &[u8], _: &[u8]) {
runtime::storage_write(key, "".as_bytes(), self.encode().as_mut_slice())
}
}
#[cfg(test)]
mod tests {
use alloc::string::String;
use crate::spread::SpreadLayout;
#[test]
fn test_spread_layout() {
let _mock = fvm_mock::build_runtime();
let a = 10;
let b = String::from("test");
a.write_ledger("key_a".as_bytes(), &[]);
b.write_ledger("key_b".as_bytes(), &[]);
let aa: i32 = SpreadLayout::read_ledger("key_a".as_bytes(), &[]);
let bb: String = SpreadLayout::read_ledger("key_b".as_bytes(), &[]);
assert_eq!(a, aa);
assert_eq!(b, bb);
}
}