1use crate::runtime;
2use scale::{Decode, Encode};
3
4pub trait SpreadLayout {
7 fn read_ledger(key: &[u8], prefix: &[u8]) -> Self;
9
10 fn write_ledger(&self, key: &[u8], prefix: &[u8]);
12}
13
14
15impl<T> SpreadLayout for T where T: Encode + Decode + Default {
18 fn read_ledger(key: &[u8], _: &[u8]) -> Self {
19 match runtime::storage_read(key, "".as_bytes()) {
22 Some(value) => {
23 <T>::decode(&mut &value[..]).unwrap()
24 }
25 None => { Default::default() }
26 }
27 }
28
29 fn write_ledger(&self, key: &[u8], _: &[u8]) {
31 runtime::storage_write(key, "".as_bytes(), self.encode().as_mut_slice())
32 }
33}
34
35#[cfg(test)]
36mod tests {
37 use alloc::string::String;
38 use crate::spread::SpreadLayout;
39
40 #[test]
41 fn test_spread_layout() {
42 let _mock = fvm_mock::build_runtime();
43 let a = 10;
44 let b = String::from("test");
45 a.write_ledger("key_a".as_bytes(), &[]);
46 b.write_ledger("key_b".as_bytes(), &[]);
47
48 let aa: i32 = SpreadLayout::read_ledger("key_a".as_bytes(), &[]);
49 let bb: String = SpreadLayout::read_ledger("key_b".as_bytes(), &[]);
50 assert_eq!(a, aa);
51 assert_eq!(b, bb);
52 }
53}