facet_msgpack/
deserialize.rs1use crate::constants::*;
2use crate::errors::Error as DecodeError;
3
4use facet_core::{Def, Facet};
5use facet_reflect::{HeapValue, Wip};
6use log::trace;
7
8pub fn from_slice<'input: 'facet, 'facet, T: Facet<'facet>>(
32 msgpack: &'input [u8],
33) -> Result<T, DecodeError> {
34 from_slice_value(Wip::alloc::<T>()?, msgpack)?
35 .materialize::<T>()
36 .map_err(|e| DecodeError::UnsupportedType(e.to_string()))
37}
38
39#[deprecated(since = "0.1.0", note = "Use from_slice instead")]
41pub fn from_str<'input: 'facet, 'facet, T: Facet<'facet>>(
42 msgpack: &'input [u8],
43) -> Result<T, DecodeError> {
44 from_slice(msgpack)
45}
46
47#[allow(clippy::needless_lifetimes)]
87pub fn from_slice_value<'mem>(
88 wip: Wip<'mem>,
89 msgpack: &'mem [u8],
90) -> Result<HeapValue<'mem>, DecodeError> {
91 let mut decoder = Decoder::new(msgpack);
92 decoder
93 .deserialize_value(wip)?
94 .build()
95 .map_err(|e| DecodeError::UnsupportedType(e.to_string()))
96}
97
98struct Decoder<'input> {
99 input: &'input [u8],
100 offset: usize,
101}
102
103impl<'input> Decoder<'input> {
104 fn new(input: &'input [u8]) -> Self {
105 Decoder { input, offset: 0 }
106 }
107
108 fn decode_u8(&mut self) -> Result<u8, DecodeError> {
111 if self.offset >= self.input.len() {
112 return Err(DecodeError::InsufficientData);
113 }
114 let value = self.input[self.offset];
115 self.offset += 1;
116 Ok(value)
117 }
118
119 fn decode_u16(&mut self) -> Result<u16, DecodeError> {
122 if self.offset + 2 > self.input.len() {
123 return Err(DecodeError::InsufficientData);
124 }
125 let value =
126 u16::from_be_bytes(self.input[self.offset..self.offset + 2].try_into().unwrap());
127 self.offset += 2;
128 Ok(value)
129 }
130
131 fn decode_u32(&mut self) -> Result<u32, DecodeError> {
134 if self.offset + 4 > self.input.len() {
135 return Err(DecodeError::InsufficientData);
136 }
137 let value =
138 u32::from_be_bytes(self.input[self.offset..self.offset + 4].try_into().unwrap());
139 self.offset += 4;
140 Ok(value)
141 }
142
143 fn decode_u64(&mut self) -> Result<u64, DecodeError> {
153 match self.decode_u8()? {
154 MSGPACK_UINT8 => Ok(self.decode_u8()? as u64),
155 MSGPACK_UINT16 => Ok(self.decode_u16()? as u64),
156 MSGPACK_UINT32 => Ok(self.decode_u32()? as u64),
157 MSGPACK_UINT64 => {
158 if self.offset + 8 > self.input.len() {
159 return Err(DecodeError::InsufficientData);
160 }
161 let value = u64::from_be_bytes(
162 self.input[self.offset..self.offset + 8].try_into().unwrap(),
163 );
164 self.offset += 8;
165 Ok(value)
166 }
167 prefix @ MSGPACK_POSFIXINT_MIN..=MSGPACK_POSFIXINT_MAX => Ok(prefix as u64),
168 _ => Err(DecodeError::UnexpectedType),
169 }
170 }
171
172 fn decode_string(&mut self) -> Result<String, DecodeError> {
181 let prefix = self.decode_u8()?;
182
183 let len = match prefix {
184 prefix @ MSGPACK_FIXSTR_MIN..=MSGPACK_FIXSTR_MAX => (prefix & 0x1f) as usize,
185 MSGPACK_STR8 => self.decode_u8()? as usize,
186 MSGPACK_STR16 => self.decode_u16()? as usize,
187 MSGPACK_STR32 => self.decode_u32()? as usize,
188 _ => return Err(DecodeError::UnexpectedType),
189 };
190
191 if self.offset + len > self.input.len() {
192 return Err(DecodeError::InsufficientData);
193 }
194
195 let value = String::from_utf8(self.input[self.offset..self.offset + len].to_vec())
196 .map_err(|_| DecodeError::InvalidData)?;
197 self.offset += len;
198 Ok(value)
199 }
200
201 fn decode_map_len(&mut self) -> Result<usize, DecodeError> {
209 let prefix = self.decode_u8()?;
210
211 match prefix {
212 prefix @ MSGPACK_FIXMAP_MIN..=MSGPACK_FIXMAP_MAX => Ok((prefix & 0x0f) as usize),
213 MSGPACK_MAP16 => Ok(self.decode_u16()? as usize),
214 MSGPACK_MAP32 => Ok(self.decode_u32()? as usize),
215 _ => Err(DecodeError::UnexpectedType),
216 }
217 }
218
219 #[allow(dead_code)]
227 fn decode_array_len(&mut self) -> Result<usize, DecodeError> {
228 let prefix = self.decode_u8()?;
229
230 match prefix {
231 prefix @ MSGPACK_FIXARRAY_MIN..=MSGPACK_FIXARRAY_MAX => Ok((prefix & 0x0f) as usize),
232 MSGPACK_ARRAY16 => Ok(self.decode_u16()? as usize),
233 MSGPACK_ARRAY32 => Ok(self.decode_u32()? as usize),
234 _ => Err(DecodeError::UnexpectedType),
235 }
236 }
237
238 fn decode_bool(&mut self) -> Result<bool, DecodeError> {
245 match self.decode_u8()? {
246 MSGPACK_TRUE => Ok(true),
247 MSGPACK_FALSE => Ok(false),
248 _ => Err(DecodeError::UnexpectedType),
249 }
250 }
251
252 #[allow(dead_code)]
258 fn decode_nil(&mut self) -> Result<(), DecodeError> {
259 match self.decode_u8()? {
260 MSGPACK_NIL => Ok(()),
261 _ => Err(DecodeError::UnexpectedType),
262 }
263 }
264
265 #[allow(dead_code)]
268 fn peek_nil(&mut self) -> Result<bool, DecodeError> {
269 if self.offset >= self.input.len() {
270 return Err(DecodeError::InsufficientData);
271 }
272 Ok(self.input[self.offset] == MSGPACK_NIL)
273 }
274
275 fn skip_value(&mut self) -> Result<(), DecodeError> {
278 let prefix = self.decode_u8()?;
279
280 match prefix {
281 prefix @ MSGPACK_FIXSTR_MIN..=MSGPACK_FIXSTR_MAX => {
283 let len = (prefix & 0x1f) as usize;
284 if self.offset + len > self.input.len() {
285 return Err(DecodeError::InsufficientData);
286 }
287 self.offset += len;
288 Ok(())
289 }
290 MSGPACK_STR8 => {
291 let len = self.decode_u8()? as usize;
292 if self.offset + len > self.input.len() {
293 return Err(DecodeError::InsufficientData);
294 }
295 self.offset += len;
296 Ok(())
297 }
298 MSGPACK_STR16 => {
299 let len = self.decode_u16()? as usize;
300 if self.offset + len > self.input.len() {
301 return Err(DecodeError::InsufficientData);
302 }
303 self.offset += len;
304 Ok(())
305 }
306 MSGPACK_STR32 => {
307 let len = self.decode_u32()? as usize;
308 if self.offset + len > self.input.len() {
309 return Err(DecodeError::InsufficientData);
310 }
311 self.offset += len;
312 Ok(())
313 }
314
315 MSGPACK_UINT8 => {
317 self.offset += 1;
318 Ok(())
319 }
320 MSGPACK_UINT16 => {
321 self.offset += 2;
322 Ok(())
323 }
324 MSGPACK_UINT32 => {
325 self.offset += 4;
326 Ok(())
327 }
328 MSGPACK_UINT64 => {
329 self.offset += 8;
330 Ok(())
331 }
332 MSGPACK_INT8 => {
333 self.offset += 1;
334 Ok(())
335 }
336 MSGPACK_INT16 => {
337 self.offset += 2;
338 Ok(())
339 }
340 MSGPACK_INT32 => {
341 self.offset += 4;
342 Ok(())
343 }
344 MSGPACK_INT64 => {
345 self.offset += 8;
346 Ok(())
347 }
348 MSGPACK_NIL | MSGPACK_TRUE | MSGPACK_FALSE => Ok(()),
352
353 prefix @ MSGPACK_FIXMAP_MIN..=MSGPACK_FIXMAP_MAX => {
355 let len = (prefix & 0x0f) as usize;
356 for _ in 0..len {
357 self.skip_value()?; self.skip_value()?; }
360 Ok(())
361 }
362 MSGPACK_MAP16 => {
363 let len = self.decode_u16()? as usize;
364 for _ in 0..len {
365 self.skip_value()?; self.skip_value()?; }
368 Ok(())
369 }
370 MSGPACK_MAP32 => {
371 let len = self.decode_u32()? as usize;
372 for _ in 0..len {
373 self.skip_value()?; self.skip_value()?; }
376 Ok(())
377 }
378
379 prefix @ MSGPACK_FIXARRAY_MIN..=MSGPACK_FIXARRAY_MAX => {
381 let len = (prefix & 0x0f) as usize;
382 for _ in 0..len {
383 self.skip_value()?;
384 }
385 Ok(())
386 }
387 MSGPACK_ARRAY16 => {
388 let len = self.decode_u16()? as usize;
389 for _ in 0..len {
390 self.skip_value()?;
391 }
392 Ok(())
393 }
394 MSGPACK_ARRAY32 => {
395 let len = self.decode_u32()? as usize;
396 for _ in 0..len {
397 self.skip_value()?;
398 }
399 Ok(())
400 }
401
402 _ => Err(DecodeError::UnexpectedType),
403 }
404 }
405
406 fn deserialize_value(&mut self, wip: Wip<'input>) -> Result<Wip<'input>, DecodeError> {
407 let shape = wip.shape();
408 trace!("Deserializing {:?}", shape);
409
410 let wip = match shape.def {
411 Def::Scalar(_) => {
412 trace!("Deserializing scalar");
413 if shape.is_type::<String>() {
414 let s = self.decode_string()?;
415 wip.put(s).unwrap()
416 } else if shape.is_type::<u64>() {
417 let n = self.decode_u64()?;
418 wip.put(n).unwrap()
419 } else if shape.is_type::<u32>() {
420 let n = self.decode_u64()?;
421 if n > u32::MAX as u64 {
422 return Err(DecodeError::IntegerOverflow);
423 }
424 wip.put(n as u32).unwrap()
425 } else if shape.is_type::<u16>() {
426 let n = self.decode_u64()?;
427 if n > u16::MAX as u64 {
428 return Err(DecodeError::IntegerOverflow);
429 }
430 wip.put(n as u16).unwrap()
431 } else if shape.is_type::<u8>() {
432 let n = self.decode_u64()?;
433 if n > u8::MAX as u64 {
434 return Err(DecodeError::IntegerOverflow);
435 }
436 wip.put(n as u8).unwrap()
437 } else if shape.is_type::<i64>() {
438 let n = self.decode_u64()?;
440 if n > i64::MAX as u64 {
441 return Err(DecodeError::IntegerOverflow);
442 }
443 wip.put(n as i64).unwrap()
444 } else if shape.is_type::<i32>() {
445 let n = self.decode_u64()?;
446 if n > i32::MAX as u64 {
447 return Err(DecodeError::IntegerOverflow);
448 }
449 wip.put(n as i32).unwrap()
450 } else if shape.is_type::<bool>() {
451 let b = self.decode_bool()?;
452 wip.put(b).unwrap()
453 } else {
454 return Err(DecodeError::UnsupportedType(format!("{}", shape)));
455 }
456 }
457 Def::Struct(_) => {
458 trace!("Deserializing struct");
459 let map_len = self.decode_map_len()?;
460
461 let mut wip = wip;
462 for _ in 0..map_len {
463 let key = self.decode_string()?;
464 match wip.field_index(&key) {
465 Some(index) => {
466 wip = self
467 .deserialize_value(wip.field(index).unwrap())?
468 .pop()
469 .unwrap();
470 }
471 None => {
472 self.skip_value()?;
474 trace!("Skipping unknown field: {}", key);
475 }
476 }
477 }
478 wip
479 }
480 _ => {
481 return Err(DecodeError::UnsupportedShape(format!("{:?}", shape)));
482 }
483 };
484
485 Ok(wip)
486 }
487}