sbs_api_internal/
lib.rs

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}