msgpack/unpack/
value.rs

1use crate::primitive::*;
2use crate::{code, unpack, value, value::Value, UnpackError};
3use std::io;
4
5pub fn unpack_bin_data<R: io::Read>(reader: &mut R, len: usize) -> Result<Vec<u8>, UnpackError> {
6    let mut buf = Vec::with_capacity(len);
7    buf.resize(len as usize, 0u8);
8    read_data(reader, &mut buf[..])?;
9    Ok(buf)
10}
11
12pub fn unpack_ary_data<R: io::Read>(reader: &mut R, len: usize) -> Result<Vec<Value>, UnpackError> {
13    let mut vec = Vec::with_capacity(len);
14    for _ in 0..len {
15        vec.push(unpack_value(reader)?);
16    }
17
18    Ok(vec)
19}
20
21pub fn unpack_str_data<R: io::Read>(
22    reader: &mut R,
23    len: usize,
24) -> Result<value::Utf8String, UnpackError> {
25    let buf = unpack_bin_data(reader, len)?;
26    Ok(value::Utf8String::from(buf))
27}
28
29pub fn unpack_map_data<R: io::Read>(
30    reader: &mut R,
31    len: usize,
32) -> Result<Vec<(Value, Value)>, UnpackError> {
33    let mut vec = Vec::with_capacity(len);
34    for _ in 0..len {
35        vec.push((unpack_value(reader)?, unpack_value(reader)?));
36    }
37    Ok(vec)
38}
39
40fn unpack_ext_type_data<R: io::Read>(
41    reader: &mut R,
42    len: usize,
43) -> Result<(i8, Vec<u8>), UnpackError> {
44    let ty = read_data_i8(reader)?;
45    let vec = unpack_bin_data(reader, len)?;
46    Ok((ty, vec))
47}
48
49pub fn unpack_bin<R>(reader: &mut R) -> Result<Vec<u8>, UnpackError>
50where
51    R: io::Read,
52{
53    let len = unpack::unpack_bin_header(reader)?;
54    unpack_bin_data(reader, len)
55}
56
57pub fn unpack_value<R>(reader: &mut R) -> Result<Value, UnpackError>
58where
59    R: io::Read,
60{
61    use code::Code;
62    let val = match read_code(reader)? {
63        Code::Nil => Value::Nil,
64        Code::True => Value::from(true),
65        Code::False => Value::from(false),
66        Code::PosInt(v) => Value::from(v),
67        Code::Uint8 => Value::from(read_data_u8(reader)?),
68        Code::Uint16 => Value::from(read_data_u16(reader)?),
69        Code::Uint32 => Value::from(read_data_u32(reader)?),
70        Code::Uint64 => Value::from(read_data_u64(reader)?),
71        Code::NegInt(v) => Value::from(v),
72        Code::Int8 => Value::from(read_data_i8(reader)?),
73        Code::Int16 => Value::from(read_data_i16(reader)?),
74        Code::Int32 => Value::from(read_data_i32(reader)?),
75        Code::Int64 => Value::from(read_data_i64(reader)?),
76        Code::Float32 => Value::from(read_data_f32(reader)?),
77        Code::Float64 => Value::from(read_data_f64(reader)?),
78        Code::Bin8 => {
79            let len = usize::from(read_data_u8(reader)?);
80            Value::Binary(unpack_bin_data(reader, len)?)
81        }
82        Code::Bin16 => {
83            let len = usize::from(read_data_u16(reader)?);
84            Value::Binary(unpack_bin_data(reader, len)?)
85        }
86        Code::Bin32 => {
87            let len = read_data_u32(reader)? as usize;
88            Value::Binary(unpack_bin_data(reader, len)?)
89        }
90        Code::FixStr(len) => Value::String(unpack_str_data(reader, usize::from(len))?),
91        Code::Str8 => {
92            let len = usize::from(read_data_u8(reader)?);
93            Value::String(unpack_str_data(reader, len)?)
94        }
95        Code::Str16 => {
96            let len = usize::from(read_data_u16(reader)?);
97            Value::String(unpack_str_data(reader, len)?)
98        }
99        Code::Str32 => {
100            let len = read_data_u32(reader)?;
101            Value::String(unpack_str_data(reader, len as usize)?)
102        }
103        Code::FixArray(len) => Value::Array(unpack_ary_data(reader, len as usize)?),
104        Code::Array16 => {
105            let len = usize::from(read_data_u16(reader)?);
106            Value::Array(unpack_ary_data(reader, len)?)
107        }
108        Code::Array32 => {
109            let len = read_data_u32(reader)? as usize;
110            Value::Array(unpack_ary_data(reader, len)?)
111        }
112        Code::FixMap(len) => Value::Map(unpack_map_data(reader, len as usize)?),
113        Code::Map16 => {
114            let len = usize::from(read_data_u16(reader)?);
115            Value::Map(unpack_map_data(reader, len)?)
116        }
117        Code::Map32 => {
118            let len = read_data_u16(reader)? as usize;
119            Value::Map(unpack_map_data(reader, len)?)
120        }
121        Code::FixExt1 => {
122            let (ty, vec) = unpack_ext_type_data(reader, 1)?;
123            Value::Extension(ty, vec)
124        }
125        Code::FixExt2 => {
126            let (ty, vec) = unpack_ext_type_data(reader, 2)?;
127            Value::Extension(ty, vec)
128        }
129        Code::FixExt4 => {
130            let (ty, vec) = unpack_ext_type_data(reader, 4)?;
131            Value::Extension(ty, vec)
132        }
133        Code::FixExt8 => {
134            let (ty, vec) = unpack_ext_type_data(reader, 8)?;
135            Value::Extension(ty, vec)
136        }
137        Code::FixExt16 => {
138            let (ty, vec) = unpack_ext_type_data(reader, 16)?;
139            Value::Extension(ty, vec)
140        }
141        Code::Ext8 => {
142            let len = usize::from(read_data_u8(reader)?);
143            let (ty, vec) = unpack_ext_type_data(reader, len)?;
144            Value::Extension(ty, vec)
145        }
146        Code::Ext16 => {
147            let len = usize::from(read_data_u16(reader)?);
148            let (ty, vec) = unpack_ext_type_data(reader, len)?;
149            Value::Extension(ty, vec)
150        }
151        Code::Ext32 => {
152            let len = read_data_u32(reader)? as usize;
153            let (ty, vec) = unpack_ext_type_data(reader, len)?;
154            Value::Extension(ty, vec)
155        }
156        Code::Reserved => unreachable!(),
157    };
158
159    Ok(val)
160}