1use std::convert::From;
2use std::fmt;
3use std::io;
4use std::io::Read;
5use std::string::FromUtf8Error;
6
7use crate::*;
8
9pub fn parse<R: Read>(r: R) -> Result<Value> {
14 let mut parser = Parser::new(r);
15 parser.parse()
16}
17
18#[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord)]
19enum Type {
20 End,
21 Byte,
22 Short,
23 Int,
24 Long,
25 Float,
26 Double,
27 ByteArray,
28 Str,
29 List,
30 Compound,
31 IntArray,
32 LongArray,
33}
34
35impl Type {
36 fn try_from(byte: u8) -> Result<Type> {
37 match byte {
38 0 => Ok(Type::End),
39 1 => Ok(Type::Byte),
40 2 => Ok(Type::Short),
41 3 => Ok(Type::Int),
42 4 => Ok(Type::Long),
43 5 => Ok(Type::Float),
44 6 => Ok(Type::Double),
45 7 => Ok(Type::ByteArray),
46 8 => Ok(Type::Str),
47 9 => Ok(Type::List),
48 10 => Ok(Type::Compound),
49 11 => Ok(Type::IntArray),
50 12 => Ok(Type::LongArray),
51 b => Err(ParseError::UnknownTag(b)),
52 }
53 }
54}
55
56#[derive(Debug)]
58pub enum ParseError {
59 InvalidUTF8(FromUtf8Error),
60 ReadError(io::Error),
61 UnexpectedEndOfInput,
62 UnexpectedTag,
63 UnknownTag(u8),
64}
65
66impl fmt::Display for ParseError {
67 fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
68 match self {
69 ParseError::InvalidUTF8(ref cause) => cause.fmt(f),
70 ParseError::ReadError(ref cause) => cause.fmt(f),
71 ParseError::UnexpectedEndOfInput => write!(f, "unexpected input end"),
72 ParseError::UnexpectedTag => write!(f, "unexpected tag"),
73 ParseError::UnknownTag(b) => write!(f, "found unknown tag {}", b),
74 }
75 }
76}
77
78impl std::error::Error for ParseError {
79 fn source(&self) -> Option<&(dyn std::error::Error + 'static)> {
80 match self {
81 ParseError::ReadError(ref cause) => Some(cause),
82 ParseError::InvalidUTF8(ref cause) => Some(cause),
83 _ => None,
84 }
85 }
86}
87
88impl From<io::Error> for ParseError {
89 fn from(e: io::Error) -> ParseError {
90 match e.kind() {
91 io::ErrorKind::UnexpectedEof => ParseError::UnexpectedEndOfInput,
92 _ => ParseError::ReadError(e),
93 }
94 }
95}
96
97impl From<FromUtf8Error> for ParseError {
98 fn from(e: FromUtf8Error) -> ParseError {
99 ParseError::InvalidUTF8(e)
100 }
101}
102
103pub type Result<T> = std::result::Result<T, ParseError>;
104
105#[derive(Debug)]
106struct Parser<R> {
107 r: R,
108}
109
110impl<R: Read> Parser<R> {
111 pub fn new(r: R) -> Parser<R> {
112 Parser { r }
113 }
114
115 pub fn parse(&mut self) -> Result<Value> {
116 let mut root = Compound::new();
117
118 while let Some(tag) = self.read_tag()? {
119 let name = self.read_str()?;
120 let payload = self.parse_value_with_tag(tag)?;
121 root.insert(name, payload);
122 }
123
124 Ok(Value::Compound(root))
125 }
126
127 fn parse_value_with_tag(&mut self, tag: Type) -> Result<Value> {
130 match tag {
131 Type::End => Err(ParseError::UnexpectedTag),
132 Type::Byte => self.parse_byte(),
133 Type::Short => self.parse_short(),
134 Type::Int => self.parse_int(),
135 Type::Long => self.parse_long(),
136 Type::Float => self.parse_float(),
137 Type::Double => self.parse_double(),
138 Type::ByteArray => self.parse_byte_array(),
139 Type::Str => self.parse_str(),
140 Type::List => self.parse_list(),
141 Type::Compound => self.parse_compound(),
142 Type::IntArray => self.parse_int_array(),
143 Type::LongArray => self.parse_long_array(),
144 }
145 }
146
147 fn parse_byte(&mut self) -> Result<Value> {
150 Ok(Value::Byte(self.read_byte()?))
151 }
152
153 fn parse_short(&mut self) -> Result<Value> {
154 Ok(Value::Short(self.read_short()?))
155 }
156
157 fn parse_int(&mut self) -> Result<Value> {
158 Ok(Value::Int(self.read_int()?))
159 }
160
161 fn parse_long(&mut self) -> Result<Value> {
162 Ok(Value::Long(self.read_long()?))
163 }
164
165 fn parse_float(&mut self) -> Result<Value> {
166 Ok(Value::Float(self.read_float()?))
167 }
168
169 fn parse_double(&mut self) -> Result<Value> {
170 Ok(Value::Double(self.read_double()?))
171 }
172
173 fn parse_byte_array(&mut self) -> Result<Value> {
174 Ok(Value::ByteArray(self.read_byte_array()?))
175 }
176
177 fn parse_str(&mut self) -> Result<Value> {
178 Ok(Value::Str(self.read_str()?))
179 }
180
181 fn parse_compound(&mut self) -> Result<Value> {
182 Ok(Value::Compound(self.read_compound()?))
183 }
184
185 fn parse_int_array(&mut self) -> Result<Value> {
186 Ok(Value::IntArray(self.read_int_array()?))
187 }
188
189 fn parse_long_array(&mut self) -> Result<Value> {
190 Ok(Value::LongArray(self.read_long_array()?))
191 }
192
193 fn parse_list(&mut self) -> Result<Value> {
196 if let Some(tag) = self.read_tag()? {
197 let size = self.read_int()? as usize;
198
199 match tag {
200 Type::End => Ok(Value::EndList),
201 Type::Byte => {
202 if size == 0 {
203 Ok(Value::EmptyByteList)
204 } else {
205 self.parse_byte_list(size)
206 }
207 }
208 Type::Short => self.parse_short_list(size),
209 Type::Int => self.parse_int_list(size),
210 Type::Long => self.parse_long_list(size),
211 Type::Float => self.parse_float_list(size),
212 Type::Double => self.parse_double_list(size),
213 Type::ByteArray => self.parse_byte_array_list(size),
214 Type::Str => self.parse_str_list(size),
215 Type::List => self.parse_list_list(size),
216 Type::Compound => self.parse_compound_list(size),
217 Type::IntArray => self.parse_int_array_list(size),
218 Type::LongArray => self.parse_long_array_list(size),
219 }
220 } else {
221 Err(ParseError::UnexpectedEndOfInput)
222 }
223 }
224
225 fn parse_byte_list(&mut self, size: usize) -> Result<Value> {
226 let mut list: Vec<i8> = Vec::with_capacity(size);
227 for _ in 0..size {
228 list.push(self.read_byte()?);
229 }
230 Ok(Value::ByteList(list))
231 }
232
233 fn parse_short_list(&mut self, size: usize) -> Result<Value> {
234 let mut list: Vec<i16> = Vec::with_capacity(size);
235 for _ in 0..size {
236 list.push(self.read_short()?);
237 }
238 Ok(Value::ShortList(list))
239 }
240
241 fn parse_int_list(&mut self, size: usize) -> Result<Value> {
242 let mut list: Vec<i32> = Vec::with_capacity(size);
243 for _ in 0..size {
244 list.push(self.read_int()?);
245 }
246 Ok(Value::IntList(list))
247 }
248
249 fn parse_long_list(&mut self, size: usize) -> Result<Value> {
250 let mut list: Vec<i64> = Vec::with_capacity(size);
251 for _ in 0..size {
252 list.push(self.read_long()?);
253 }
254 Ok(Value::LongList(list))
255 }
256
257 fn parse_float_list(&mut self, size: usize) -> Result<Value> {
258 let mut list: Vec<f32> = Vec::with_capacity(size);
259 for _ in 0..size {
260 list.push(self.read_float()?);
261 }
262 Ok(Value::FloatList(list))
263 }
264
265 fn parse_double_list(&mut self, size: usize) -> Result<Value> {
266 let mut list: Vec<f64> = Vec::with_capacity(size);
267 for _ in 0..size {
268 list.push(self.read_double()?);
269 }
270 Ok(Value::DoubleList(list))
271 }
272
273 fn parse_byte_array_list(&mut self, size: usize) -> Result<Value> {
274 let mut list: Vec<Vec<i8>> = Vec::with_capacity(size);
275 for _ in 0..size {
276 list.push(self.read_byte_array()?);
277 }
278 Ok(Value::ByteArrayList(list))
279 }
280
281 fn parse_str_list(&mut self, size: usize) -> Result<Value> {
282 let mut list: Vec<String> = Vec::with_capacity(size);
283 for _ in 0..size {
284 list.push(self.read_str()?);
285 }
286 Ok(Value::StrList(list))
287 }
288
289 fn parse_list_list(&mut self, size: usize) -> Result<Value> {
290 let mut list: Vec<Value> = Vec::with_capacity(size);
291 for _ in 0..size {
292 list.push(self.parse_list()?);
293 }
294 Ok(Value::ListList(list))
295 }
296
297 fn parse_compound_list(&mut self, size: usize) -> Result<Value> {
298 let mut list: Vec<Compound> = Vec::with_capacity(size);
299 for _ in 0..size {
300 list.push(self.read_compound()?);
301 }
302 Ok(Value::CompoundList(list))
303 }
304
305 fn parse_int_array_list(&mut self, size: usize) -> Result<Value> {
306 let mut list: Vec<Vec<i32>> = Vec::with_capacity(size);
307 for _ in 0..size {
308 list.push(self.read_int_array()?);
309 }
310 Ok(Value::IntArrayList(list))
311 }
312
313 fn parse_long_array_list(&mut self, size: usize) -> Result<Value> {
314 let mut list: Vec<Vec<i64>> = Vec::with_capacity(size);
315 for _ in 0..size {
316 list.push(self.read_long_array()?);
317 }
318 Ok(Value::LongArrayList(list))
319 }
320
321 fn read_tag(&mut self) -> Result<Option<Type>> {
324 let mut bs: [u8; 1] = [0; 1];
325
326 match self.r.read_exact(&mut bs) {
327 Ok(()) => Ok(Some(Type::try_from(bs[0])?)),
328 Err(e) => {
329 if e.kind() == io::ErrorKind::UnexpectedEof {
330 Ok(None)
331 } else {
332 Err(ParseError::from(e))
333 }
334 }
335 }
336 }
337
338 fn read_byte(&mut self) -> Result<i8> {
339 let mut bs = [0u8; 1];
340 self.r.read_exact(&mut bs)?;
341 Ok(i8::from_be_bytes(bs))
342 }
343
344 fn read_short(&mut self) -> Result<i16> {
345 let mut bs = [0u8; 2];
346 self.r.read_exact(&mut bs)?;
347 Ok(i16::from_be_bytes(bs))
348 }
349
350 fn read_int(&mut self) -> Result<i32> {
351 let mut bs = [0u8; 4];
352 self.r.read_exact(&mut bs)?;
353 Ok(i32::from_be_bytes(bs))
354 }
355
356 fn read_long(&mut self) -> Result<i64> {
357 let mut bs = [0u8; 8];
358 self.r.read_exact(&mut bs)?;
359 Ok(i64::from_be_bytes(bs))
360 }
361
362 fn read_float(&mut self) -> Result<f32> {
363 let mut bs = [0u8; 4];
364 self.r.read_exact(&mut bs)?;
365 let x = u32::from_be_bytes(bs);
366 Ok(f32::from_bits(x))
367 }
368
369 fn read_double(&mut self) -> Result<f64> {
370 let mut bs = [0u8; 8];
371 self.r.read_exact(&mut bs)?;
372 let x = u64::from_be_bytes(bs);
373 Ok(f64::from_bits(x))
374 }
375
376 fn read_byte_array(&mut self) -> Result<Vec<i8>> {
377 let size = self.read_int()? as usize;
378 let mut arr: Vec<i8> = Vec::with_capacity(size);
379
380 for _ in 0..size {
381 arr.push(self.read_byte()?);
382 }
383
384 Ok(arr)
385 }
386
387 fn read_str(&mut self) -> Result<String> {
388 let size = self.read_short()? as usize;
389
390 let mut bs = vec![0u8; size];
391 self.r.read_exact(bs.as_mut_slice())?;
392
393 Ok(String::from_utf8(bs)?)
394 }
395
396 fn read_compound(&mut self) -> Result<Compound> {
397 let mut root = Compound::new();
398
399 loop {
400 if let Some(tag) = self.read_tag()? {
401 if tag == Type::End {
402 return Ok(root);
403 }
404
405 let name = self.read_str()?;
406 let payload = self.parse_value_with_tag(tag)?;
407 root.insert(name, payload);
408 } else {
409 return Err(ParseError::UnexpectedEndOfInput);
410 }
411 }
412 }
413
414 fn read_int_array(&mut self) -> Result<Vec<i32>> {
415 let size = self.read_int()? as usize;
416 let mut arr: Vec<i32> = Vec::with_capacity(size);
417
418 for _ in 0..size {
419 arr.push(self.read_int()?);
420 }
421
422 Ok(arr)
423 }
424
425 fn read_long_array(&mut self) -> Result<Vec<i64>> {
426 let size = self.read_int()? as usize;
427 let mut arr: Vec<i64> = Vec::with_capacity(size);
428
429 for _ in 0..size {
430 arr.push(self.read_long()?);
431 }
432
433 Ok(arr)
434 }
435}