1use std;
2use std::io::{self, Cursor, ErrorKind, Read};
3use std::str;
4
5use rmp::decode::{read_marker, RmpRead};
6use rmp::Marker;
7
8use super::Error;
9use crate::{Utf8StringRef, ValueRef};
10
11fn read_str_data<'a, R>(rd: &mut R, len: usize, depth: u16) -> Result<Utf8StringRef<'a>, Error>
12 where R: BorrowRead<'a>
13{
14 let depth = super::decrement_depth(depth)?;
15 let buf = read_bin_data(rd, len, depth)?;
16 match str::from_utf8(buf) {
17 Ok(s) => Ok(Utf8StringRef::from(s)),
18 Err(err) => {
19 let s = Utf8StringRef {
20 s: Err((buf, err)),
21 };
22 Ok(s)
23 }
24 }
25}
26
27fn read_bin_data<'a, R>(rd: &mut R, len: usize, depth: u16) -> Result<&'a [u8], Error>
28 where R: BorrowRead<'a>
29{
30 let _depth = super::decrement_depth(depth)?;
31 let buf = rd.fill_buf();
32
33 if len > buf.len() {
34 return Err(Error::InvalidDataRead(io::Error::new(ErrorKind::UnexpectedEof, "unexpected EOF")));
35 }
36
37 let buf = &buf[..len];
39 rd.consume(len);
40
41 Ok(buf)
42}
43
44fn read_ext_body<'a, R>(rd: &mut R, len: usize, depth: u16) -> Result<(i8, &'a [u8]), Error>
45 where R: BorrowRead<'a>
46{
47 let depth = super::decrement_depth(depth)?;
48 let ty = rd.read_data_i8()?;
49 let buf = read_bin_data(rd, len, depth)?;
50
51 Ok((ty, buf))
52}
53
54fn read_array_data<'a, R>(rd: &mut R, mut len: usize, depth: u16) -> Result<Vec<ValueRef<'a>>, Error>
55 where R: BorrowRead<'a>
56{
57 let depth = super::decrement_depth(depth)?;
58 let mut vec = Vec::new();
61
62 while len > 0 {
63 vec.push(read_value_ref_inner(rd, depth)?);
64 len -= 1;
65 }
66
67 Ok(vec)
68}
69
70fn read_map_data<'a, R>(rd: &mut R, mut len: usize, depth: u16) -> Result<Vec<(ValueRef<'a>, ValueRef<'a>)>, Error>
71 where R: BorrowRead<'a>
72{
73 let depth = super::decrement_depth(depth)?;
74 let mut vec = Vec::new();
77
78 while len > 0 {
79 vec.push((read_value_ref_inner(rd, depth)?, read_value_ref_inner(rd, depth)?));
80 len -= 1;
81 }
82
83 Ok(vec)
84}
85
86pub trait BorrowRead<'a>: Read {
91 fn fill_buf(&self) -> &'a [u8];
101
102 fn consume(&mut self, len: usize);
105}
106
107impl<'a> BorrowRead<'a> for &'a [u8] {
108 fn fill_buf(&self) -> &'a [u8] {
109 self
110 }
111
112 fn consume(&mut self, len: usize) {
113 *self = &(*self)[len..];
114 }
115}
116
117impl<'a> BorrowRead<'a> for Cursor<&'a [u8]> {
119 fn fill_buf(&self) -> &'a [u8] {
120 let len = std::cmp::min(self.position(), self.get_ref().len() as u64);
121 &self.get_ref()[len as usize..]
122 }
123
124 fn consume(&mut self, len: usize) {
125 let pos = self.position();
126 self.set_position(pos + len as u64);
127 }
128}
129
130fn read_value_ref_inner<'a, R>(rd: &mut R, depth: u16) -> Result<ValueRef<'a>, Error>
131 where R: BorrowRead<'a>
132{
133 let depth = super::decrement_depth(depth)?;
134
135 let val = match read_marker(rd)? {
138 Marker::Null => ValueRef::Nil,
139 Marker::True => ValueRef::Boolean(true),
140 Marker::False => ValueRef::Boolean(false),
141 Marker::FixPos(val) => ValueRef::from(val),
142 Marker::FixNeg(val) => ValueRef::from(val),
143 Marker::U8 => ValueRef::from(rd.read_data_u8()?),
144 Marker::U16 => ValueRef::from(rd.read_data_u16()?),
145 Marker::U32 => ValueRef::from(rd.read_data_u32()?),
146 Marker::U64 => ValueRef::from(rd.read_data_u64()?),
147 Marker::I8 => ValueRef::from(rd.read_data_i8()?),
148 Marker::I16 => ValueRef::from(rd.read_data_i16()?),
149 Marker::I32 => ValueRef::from(rd.read_data_i32()?),
150 Marker::I64 => ValueRef::from(rd.read_data_i64()?),
151 Marker::F32 => ValueRef::F32(rd.read_data_f32()?),
152 Marker::F64 => ValueRef::F64(rd.read_data_f64()?),
153 Marker::FixStr(len) => {
154 let res = read_str_data(rd, len as usize, depth)?;
155 ValueRef::String(res)
156 }
157 Marker::Str8 => {
158 let len = rd.read_data_u8()?;
159 let res = read_str_data(rd, len as usize, depth)?;
160 ValueRef::String(res)
161 }
162 Marker::Str16 => {
163 let len = rd.read_data_u16()?;
164 let res = read_str_data(rd, len as usize, depth)?;
165 ValueRef::String(res)
166 }
167 Marker::Str32 => {
168 let len = rd.read_data_u32()?;
169 let res = read_str_data(rd, len as usize, depth)?;
170 ValueRef::String(res)
171 }
172 Marker::Bin8 => {
173 let len = rd.read_data_u8()?;
174 let res = read_bin_data(rd, len as usize, depth)?;
175 ValueRef::Binary(res)
176 }
177 Marker::Bin16 => {
178 let len = rd.read_data_u16()?;
179 let res = read_bin_data(rd, len as usize, depth)?;
180 ValueRef::Binary(res)
181 }
182 Marker::Bin32 => {
183 let len = rd.read_data_u32()?;
184 let res = read_bin_data(rd, len as usize, depth)?;
185 ValueRef::Binary(res)
186 }
187 Marker::FixArray(len) => {
188 let vec = read_array_data(rd, len as usize, depth)?;
189 ValueRef::Array(vec)
190 }
191 Marker::Array16 => {
192 let len = rd.read_data_u16()?;
193 let vec = read_array_data(rd, len as usize, depth)?;
194 ValueRef::Array(vec)
195 }
196 Marker::Array32 => {
197 let len = rd.read_data_u32()?;
198 let vec = read_array_data(rd, len as usize, depth)?;
199 ValueRef::Array(vec)
200 }
201 Marker::FixMap(len) => {
202 let map = read_map_data(rd, len as usize, depth)?;
203 ValueRef::Map(map)
204 }
205 Marker::Map16 => {
206 let len = rd.read_data_u16()?;
207 let map = read_map_data(rd, len as usize, depth)?;
208 ValueRef::Map(map)
209 }
210 Marker::Map32 => {
211 let len = rd.read_data_u32()?;
212 let map = read_map_data(rd, len as usize, depth)?;
213 ValueRef::Map(map)
214 }
215 Marker::FixExt1 => {
216 let len = 1;
217 let (ty, vec) = read_ext_body(rd, len as usize, depth)?;
218 ValueRef::Ext(ty, vec)
219 }
220 Marker::FixExt2 => {
221 let len = 2;
222 let (ty, vec) = read_ext_body(rd, len as usize, depth)?;
223 ValueRef::Ext(ty, vec)
224 }
225 Marker::FixExt4 => {
226 let len = 4;
227 let (ty, vec) = read_ext_body(rd, len as usize, depth)?;
228 ValueRef::Ext(ty, vec)
229 }
230 Marker::FixExt8 => {
231 let len = 8;
232 let (ty, vec) = read_ext_body(rd, len as usize, depth)?;
233 ValueRef::Ext(ty, vec)
234 }
235 Marker::FixExt16 => {
236 let len = 16;
237 let (ty, vec) = read_ext_body(rd, len as usize, depth)?;
238 ValueRef::Ext(ty, vec)
239 }
240 Marker::Ext8 => {
241 let len = rd.read_data_u8()?;
242 let (ty, vec) = read_ext_body(rd, len as usize, depth)?;
243 ValueRef::Ext(ty, vec)
244 }
245 Marker::Ext16 => {
246 let len = rd.read_data_u16()?;
247 let (ty, vec) = read_ext_body(rd, len as usize, depth)?;
248 ValueRef::Ext(ty, vec)
249 }
250 Marker::Ext32 => {
251 let len = rd.read_data_u32()?;
252 let (ty, vec) = read_ext_body(rd, len as usize, depth)?;
253 ValueRef::Ext(ty, vec)
254 }
255 Marker::Reserved => ValueRef::Nil,
256 };
257
258 Ok(val)
259}
260
261#[inline(never)]
296pub fn read_value_ref<'a, R>(rd: &mut R) -> Result<ValueRef<'a>, Error>
297 where R: BorrowRead<'a>
298{
299 read_value_ref_inner(rd, super::MAX_DEPTH as _)
300}
301
302#[inline(never)]
316pub fn read_value_ref_with_max_depth<'a, R>(rd: &mut R, max_depth: usize) -> Result<ValueRef<'a>, Error>
317 where R: BorrowRead<'a>
318{
319 read_value_ref_inner(rd, max_depth.min(u16::MAX as _) as u16)
320}