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