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}