1use std::{error, fs, path, mem};
2
3pub trait Serialize {
4 fn serialize(&self, sbi: &mut SBI);
5}
6
7pub trait DeSerialize {
8 fn deserialize(sbi: &mut SBI, offset: &mut usize) -> Result<Self, ()> where Self: Sized;
9}
10
11pub struct SBI {
12 pub data: Vec<u8>,
13}
14
15impl SBI {
16 pub fn new() -> Self {
17 Self {
18 data: Vec::new()
19 }
20 }
21
22 pub fn from_path<P: AsRef<path::Path>>(path: P) -> Result<Self, Box<dyn error::Error>> {
23 let file = fs::read(path)?;
24
25 Ok(Self {
26 data: file,
27 })
28 }
29
30 pub fn deserialize<T: DeSerialize>(&mut self) -> Result<T, ()> {
31 let mut offset = 0;
32 T::deserialize(self, &mut offset)
33 }
34
35 pub fn serialize<T: Serialize>(&mut self, root: T) {
36 root.serialize(self)
37 }
38
39 pub fn write_to_path<P: AsRef<path::Path>>(&self, path: P) -> Result<(), Box<dyn error::Error>> {
40 fs::write(path, &self.data)?;
41 Ok(())
42 }
43}
44
45macro_rules! impl_serde_for_num {
46 ($($t:ty),*) => {
47 $(
48 impl Serialize for $t {
49 fn serialize(&self, sbi: &mut SBI) {
50 sbi.data.extend_from_slice(&self.to_be_bytes());
51 }
52 }
53
54 impl DeSerialize for $t {
55 fn deserialize(sbi: &mut SBI, offset: &mut usize) -> Result<Self, ()> {
56 const SIZE: usize = mem::size_of::<$t>();
57 let end_offset = *offset + SIZE;
58
59 if end_offset > sbi.data.len() {
60 Err(())
61 } else {
62 let data: [u8; SIZE] = (&sbi.data[*offset..end_offset]).try_into().unwrap();
63 *offset = end_offset;
64 Ok(<$t>::from_be_bytes(data))
65 }
66 }
67 }
68 )*
69 };
70}
71
72impl_serde_for_num!(
73 i8,
74 i16,
75 i32,
76 i64,
77 i128,
78 isize,
79 u8,
80 u16,
81 u32,
82 u64,
83 u128,
84 usize,
85 f32,
86 f64
87);
88
89impl<T: Serialize> Serialize for Vec<T> {
90 fn serialize(&self, sbi: &mut SBI) {
91 (self.len() as u64).serialize(sbi);
92
93 for item in self.iter() {
94 item.serialize(sbi)
95 }
96 }
97}
98
99impl<T: DeSerialize> DeSerialize for Vec<T> {
100 fn deserialize(sbi: &mut SBI, offset: &mut usize) -> Result<Self, ()> where Self: Sized {
101 let len = u64::deserialize(sbi, offset)?;
102
103 let mut ret = Vec::with_capacity(len as usize);
104 for _ in 0..len {
105 ret.push(T::deserialize(sbi, offset)?);
106 }
107
108 Ok(ret)
109 }
110}
111
112impl Serialize for String {
113 fn serialize(&self, sbi: &mut SBI) {
114 (self.len() as u64).serialize(sbi);
115
116 sbi.data.extend_from_slice(self.as_bytes())
117 }
118}
119
120impl DeSerialize for String {
121 fn deserialize(sbi: &mut SBI, offset: &mut usize) -> Result<Self, ()> where Self: Sized {
122 let len = u64::deserialize(sbi, offset)?;
123
124 let string = String::from_utf8_lossy(&sbi.data[*offset..*offset + len as usize]).to_string();
125 *offset += len as usize;
126
127 Ok(string)
128 }
129}