ferogram_tl_types/
deserialize.rs1use std::fmt;
15
16#[derive(Clone, Debug, PartialEq)]
18pub enum Error {
19 UnexpectedEof,
21 UnexpectedConstructor { id: u32 },
23}
24
25impl fmt::Display for Error {
26 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
27 match self {
28 Self::UnexpectedEof => write!(f, "unexpected end of buffer"),
29 Self::UnexpectedConstructor { id } => {
30 write!(f, "unexpected constructor id: {id:#010x}")
31 }
32 }
33 }
34}
35
36impl std::error::Error for Error {}
37
38pub type Result<T> = std::result::Result<T, Error>;
40
41pub struct Cursor<'a> {
48 buf: &'a [u8],
49 pos: usize,
50}
51
52impl<'a> Cursor<'a> {
53 pub fn from_slice(buf: &'a [u8]) -> Self {
55 Self { buf, pos: 0 }
56 }
57
58 pub fn pos(&self) -> usize {
60 self.pos
61 }
62
63 pub fn remaining(&self) -> usize {
65 self.buf.len() - self.pos
66 }
67
68 pub fn read_byte(&mut self) -> Result<u8> {
70 match self.buf.get(self.pos).copied() {
71 Some(b) => {
72 self.pos += 1;
73 Ok(b)
74 }
75 None => Err(Error::UnexpectedEof),
76 }
77 }
78
79 pub fn read_exact(&mut self, out: &mut [u8]) -> Result<()> {
81 let end = self.pos + out.len();
82 if end > self.buf.len() {
83 return Err(Error::UnexpectedEof);
84 }
85 out.copy_from_slice(&self.buf[self.pos..end]);
86 self.pos = end;
87 Ok(())
88 }
89
90 pub fn read_to_end(&mut self, out: &mut Vec<u8>) -> usize {
92 let slice = &self.buf[self.pos..];
93 out.extend_from_slice(slice);
94 self.pos = self.buf.len();
95 slice.len()
96 }
97}
98
99pub type Buffer<'a, 'b> = &'a mut Cursor<'b>;
101
102pub trait Deserializable: Sized {
106 fn deserialize(buf: Buffer) -> Result<Self>;
108
109 fn from_bytes(bytes: &[u8]) -> Result<Self> {
111 let mut cursor = Cursor::from_slice(bytes);
112 Self::deserialize(&mut cursor)
113 }
114}
115
116impl Deserializable for bool {
119 fn deserialize(buf: Buffer) -> Result<Self> {
120 match u32::deserialize(buf)? {
121 0x997275b5 => Ok(true),
122 0xbc799737 => Ok(false),
123 id => Err(Error::UnexpectedConstructor { id }),
124 }
125 }
126}
127
128impl Deserializable for i32 {
129 fn deserialize(buf: Buffer) -> Result<Self> {
130 let mut b = [0u8; 4];
131 buf.read_exact(&mut b)?;
132 Ok(i32::from_le_bytes(b))
133 }
134}
135
136impl Deserializable for u32 {
137 fn deserialize(buf: Buffer) -> Result<Self> {
138 let mut b = [0u8; 4];
139 buf.read_exact(&mut b)?;
140 Ok(u32::from_le_bytes(b))
141 }
142}
143
144impl Deserializable for i64 {
145 fn deserialize(buf: Buffer) -> Result<Self> {
146 let mut b = [0u8; 8];
147 buf.read_exact(&mut b)?;
148 Ok(i64::from_le_bytes(b))
149 }
150}
151
152impl Deserializable for f64 {
153 fn deserialize(buf: Buffer) -> Result<Self> {
154 let mut b = [0u8; 8];
155 buf.read_exact(&mut b)?;
156 Ok(f64::from_le_bytes(b))
157 }
158}
159
160impl Deserializable for [u8; 16] {
161 fn deserialize(buf: Buffer) -> Result<Self> {
162 let mut b = [0u8; 16];
163 buf.read_exact(&mut b)?;
164 Ok(b)
165 }
166}
167
168impl Deserializable for [u8; 32] {
169 fn deserialize(buf: Buffer) -> Result<Self> {
170 let mut b = [0u8; 32];
171 buf.read_exact(&mut b)?;
172 Ok(b)
173 }
174}
175
176impl Deserializable for Vec<u8> {
179 fn deserialize(buf: Buffer) -> Result<Self> {
180 let first = buf.read_byte()?;
181 let (len, header_extra) = if first != 0xfe {
182 (first as usize, 0)
183 } else {
184 let a = buf.read_byte()? as usize;
185 let b = buf.read_byte()? as usize;
186 let c = buf.read_byte()? as usize;
187 (a | (b << 8) | (c << 16), 3)
188 };
189
190 let mut data = vec![0u8; len];
191 buf.read_exact(&mut data)?;
192
193 let total = 1 + header_extra + len;
195 let padding = (4 - (total % 4)) % 4;
196 for _ in 0..padding {
197 buf.read_byte()?;
198 }
199
200 Ok(data)
201 }
202}
203
204impl Deserializable for String {
205 fn deserialize(buf: Buffer) -> Result<Self> {
206 let bytes = Vec::<u8>::deserialize(buf)?;
207 String::from_utf8(bytes).map_err(|_| Error::UnexpectedEof)
208 }
209}
210
211impl<T: Deserializable> Deserializable for Vec<T> {
214 fn deserialize(buf: Buffer) -> Result<Self> {
215 let id = u32::deserialize(buf)?;
216 if id != 0x1cb5c415 {
217 return Err(Error::UnexpectedConstructor { id });
218 }
219 let len = i32::deserialize(buf)? as usize;
220 (0..len).map(|_| T::deserialize(buf)).collect()
221 }
222}
223
224impl<T: Deserializable> Deserializable for crate::RawVec<T> {
225 fn deserialize(buf: Buffer) -> Result<Self> {
226 let len = i32::deserialize(buf)? as usize;
227 let inner = (0..len)
228 .map(|_| T::deserialize(buf))
229 .collect::<Result<_>>()?;
230 Ok(crate::RawVec(inner))
231 }
232}