1use std::str;
2
3use deser::de::{Deserialize, DeserializeDriver};
4use deser::Atom;
5use deser::Event;
6use deser::{Error, ErrorKind};
7
8enum Token<'a> {
9 Null,
10 Bool(bool),
11 Str(&'a str),
12 I64(i64),
13 U64(u64),
14 F64(f64),
15 SeqStart,
16 SeqEnd,
17 MapStart,
18 MapEnd,
19 Comma,
20 Colon,
21}
22
23macro_rules! overflow {
24 ($a:ident * 10 + $b:ident, $c:expr) => {
25 $a >= $c / 10 && ($a > $c / 10 || $b > $c % 10)
26 };
27}
28
29pub struct Deserializer<'a> {
31 input: &'a [u8],
32 pos: usize,
33 buffer: Vec<u8>,
34}
35
36enum ContainerState {
37 Map { first: bool, key_pos: bool },
38 Seq { first: bool },
39}
40
41impl<'a> Deserializer<'a> {
42 pub fn new(input: &'a [u8]) -> Deserializer<'a> {
44 Deserializer {
45 input,
46 pos: 0,
47 buffer: Vec::new(),
48 }
49 }
50
51 pub fn deserialize<T: Deserialize>(&mut self) -> Result<T, Error> {
53 let mut out = None;
54 {
55 let mut driver = DeserializeDriver::new(&mut out);
56 self.deserialize_into(&mut driver)?;
57 }
58 out.take()
59 .ok_or_else(|| Error::new(ErrorKind::EndOfFile, "empty input"))
60 }
61
62 fn deserialize_into(&mut self, driver: &mut DeserializeDriver) -> Result<(), Error> {
63 let mut token = self.next_token()?;
64 let mut stack = vec![];
65
66 loop {
67 match token {
69 Token::MapEnd => {
70 if !matches!(stack.pop(), Some(ContainerState::Map { .. })) {
71 return Err(Error::new(ErrorKind::Unexpected, "unexpected end of map"));
72 }
73 driver.emit(Event::MapEnd)?;
74 }
75 Token::SeqEnd => {
76 if !matches!(stack.pop(), Some(ContainerState::Seq { .. })) {
77 return Err(Error::new(ErrorKind::Unexpected, "unexpected end of seq"));
78 }
79 driver.emit(Event::SeqEnd)?;
80 }
81 _ => {
82 if let Some(
84 ContainerState::Seq { first: false }
85 | ContainerState::Map {
86 first: false,
87 key_pos: true,
88 },
89 ) = stack.last_mut()
90 {
91 if !matches!(token, Token::Comma) {
92 return Err(Error::new(ErrorKind::Unexpected, "expected a comma"));
93 }
94 token = self.next_token()?;
95 }
96
97 if let Some(ContainerState::Map {
99 first,
100 key_pos: key_pos @ true,
101 }) = stack.last_mut()
102 {
103 match token {
104 Token::Str(val) => driver.emit(Event::from(val))?,
105 _ => return Err(Error::new(ErrorKind::Unexpected, "expected map key")),
106 }
107 match self.next_token()? {
108 Token::Colon => {}
109 _ => return Err(Error::new(ErrorKind::Unexpected, "expected colon")),
110 }
111 token = self.next_token()?;
112 *first = false;
113 *key_pos = false;
114 continue;
115 }
116
117 match token {
118 Token::Null => driver.emit(Event::Atom(Atom::Null))?,
119 Token::Bool(val) => driver.emit(Event::from(val))?,
120 Token::Str(val) => driver.emit(Event::from(val))?,
121 Token::I64(val) => driver.emit(Event::from(val))?,
122 Token::U64(val) => driver.emit(Event::from(val))?,
123 Token::F64(val) => driver.emit(Event::from(val))?,
124 Token::MapStart => {
125 stack.push(ContainerState::Map {
126 first: true,
127 key_pos: true,
128 });
129 driver.emit(Event::MapStart)?;
130 token = self.next_token()?;
131 continue;
132 }
133 Token::SeqStart => {
134 stack.push(ContainerState::Seq { first: true });
135 driver.emit(Event::SeqStart)?;
136 token = self.next_token()?;
137 continue;
138 }
139 Token::Comma => {
140 return Err(Error::new(ErrorKind::Unexpected, "unexpected comma"));
141 }
142 Token::Colon => {
143 return Err(Error::new(ErrorKind::Unexpected, "unexpected colon"));
144 }
145 Token::SeqEnd | Token::MapEnd => unreachable!(),
146 }
147 }
148 }
149
150 match stack.last_mut() {
151 None => {
152 return if self.parse_whitespace().is_some() {
153 Err(Error::new(ErrorKind::Unexpected, "garbage after input"))
154 } else {
155 Ok(())
156 }
157 }
158 Some(ContainerState::Map { first, key_pos }) => {
159 token = self.next_token()?;
160 *key_pos = true;
161 *first = false;
162 }
163 Some(ContainerState::Seq { first }) => {
164 token = self.next_token()?;
165 *first = false;
166 }
167 }
168 }
169 }
170
171 fn next(&mut self) -> Option<u8> {
172 if self.pos < self.input.len() {
173 let ch = self.input[self.pos];
174 self.pos += 1;
175 Some(ch)
176 } else {
177 None
178 }
179 }
180
181 fn next_or_nul(&mut self) -> u8 {
182 self.next().unwrap_or(b'\0')
183 }
184
185 fn peek(&mut self) -> Option<u8> {
186 if self.pos < self.input.len() {
187 Some(self.input[self.pos])
188 } else {
189 None
190 }
191 }
192
193 fn peek_or_nul(&mut self) -> u8 {
194 self.peek().unwrap_or(b'\0')
195 }
196
197 fn bump(&mut self) {
198 self.pos += 1;
199 }
200
201 fn parse_str(&mut self) -> Result<&str, Error> {
202 fn result(bytes: &[u8]) -> &str {
203 unsafe { str::from_utf8_unchecked(bytes) }
206 }
207
208 let mut start = self.pos;
210 self.buffer.clear();
211
212 loop {
213 while self.pos < self.input.len() && !ESCAPE[usize::from(self.input[self.pos])] {
214 self.pos += 1;
215 }
216 if self.pos == self.input.len() {
217 return Err(Error::new(
218 ErrorKind::Unexpected,
219 "unexpected end of string",
220 ));
221 }
222 match self.input[self.pos] {
223 b'"' => {
224 if self.buffer.is_empty() {
225 let borrowed = &self.input[start..self.pos];
228 self.pos += 1;
229 return Ok(result(borrowed));
230 } else {
231 self.buffer.extend_from_slice(&self.input[start..self.pos]);
232 self.pos += 1;
233 return Ok(result(&self.buffer));
234 }
235 }
236 b'\\' => {
237 self.buffer.extend_from_slice(&self.input[start..self.pos]);
238 self.pos += 1;
239 self.parse_escape()?;
240 start = self.pos;
241 }
242 _ => {
243 return Err(Error::new(
244 ErrorKind::Unexpected,
245 "unexpected character in string",
246 ));
247 }
248 }
249 }
250 }
251
252 fn next_or_eof(&mut self) -> Result<u8, Error> {
253 self.next()
254 .ok_or_else(|| Error::new(ErrorKind::EndOfFile, "unexpected end of file"))
255 }
256
257 fn parse_escape(&mut self) -> Result<(), Error> {
260 let ch = self.next_or_eof()?;
261
262 match ch {
263 b'"' => self.buffer.push(b'"'),
264 b'\\' => self.buffer.push(b'\\'),
265 b'/' => self.buffer.push(b'/'),
266 b'b' => self.buffer.push(b'\x08'),
267 b'f' => self.buffer.push(b'\x0c'),
268 b'n' => self.buffer.push(b'\n'),
269 b'r' => self.buffer.push(b'\r'),
270 b't' => self.buffer.push(b'\t'),
271 b'u' => {
272 let c = match self.decode_hex_escape()? {
273 0xDC00..=0xDFFF => {
274 return Err(Error::new(ErrorKind::Unexpected, "invalid string"));
275 }
276
277 n1 @ 0xD800..=0xDBFF => {
280 if self.next_or_eof()? != b'\\' {
281 return Err(Error::new(ErrorKind::Unexpected, "invalid string"));
282 }
283 if self.next_or_eof()? != b'u' {
284 return Err(Error::new(ErrorKind::Unexpected, "invalid string"));
285 }
286
287 let n2 = self.decode_hex_escape()?;
288
289 if n2 < 0xDC00 || n2 > 0xDFFF {
290 return Err(Error::new(ErrorKind::Unexpected, "invalid string"));
291 }
292
293 let n = (u32::from(n1 - 0xD800) << 10 | u32::from(n2 - 0xDC00)) + 0x1_0000;
294
295 match char::from_u32(n) {
296 Some(c) => c,
297 None => {
298 return Err(Error::new(ErrorKind::Unexpected, "invalid string"));
299 }
300 }
301 }
302
303 n => match char::from_u32(u32::from(n)) {
304 Some(c) => c,
305 None => {
306 return Err(Error::new(ErrorKind::Unexpected, "invalid string"));
307 }
308 },
309 };
310
311 self.buffer
312 .extend_from_slice(c.encode_utf8(&mut [0_u8; 4]).as_bytes());
313 }
314 _ => {
315 return Err(Error::new(ErrorKind::Unexpected, "invalid string"));
316 }
317 }
318
319 Ok(())
320 }
321
322 fn decode_hex_escape(&mut self) -> Result<u16, Error> {
323 let mut n = 0;
324 for _ in 0..4 {
325 n = match self.next_or_eof()? {
326 c @ b'0'..=b'9' => n * 16_u16 + u16::from(c - b'0'),
327 b'a' | b'A' => n * 16_u16 + 10_u16,
328 b'b' | b'B' => n * 16_u16 + 11_u16,
329 b'c' | b'C' => n * 16_u16 + 12_u16,
330 b'd' | b'D' => n * 16_u16 + 13_u16,
331 b'e' | b'E' => n * 16_u16 + 14_u16,
332 b'f' | b'F' => n * 16_u16 + 15_u16,
333 _ => {
334 return Err(Error::new(ErrorKind::Unexpected, "invalid hex escape"));
335 }
336 };
337 }
338 Ok(n)
339 }
340
341 fn parse_whitespace(&mut self) -> Option<u8> {
342 loop {
343 match self.peek() {
344 Some(b' ') | Some(b'\n') | Some(b'\t') | Some(b'\r') => {
345 self.bump();
346 }
347 other => {
348 return other;
349 }
350 }
351 }
352 }
353
354 fn parse_ident(&mut self, ident: &[u8]) -> Result<(), Error> {
355 for expected in ident {
356 match self.next() {
357 None => {
358 return Err(Error::new(ErrorKind::EndOfFile, "unexpected end of file"));
359 }
360 Some(next) => {
361 if next != *expected {
362 return Err(Error::new(ErrorKind::Unexpected, "unexpected character"));
363 }
364 }
365 }
366 }
367 Ok(())
368 }
369
370 fn parse_integer(&mut self, nonnegative: bool, first_digit: u8) -> Result<Token, Error> {
371 match first_digit {
372 b'0' => match self.peek_or_nul() {
373 b'0'..=b'9' => Err(Error::new(
374 ErrorKind::Unexpected,
375 "only a single leading 0 is allowed",
376 )),
377 _ => self.parse_number(nonnegative, 0),
378 },
379 c @ b'1'..=b'9' => {
380 let mut res = u64::from(c - b'0');
381
382 loop {
383 match self.peek_or_nul() {
384 c @ b'0'..=b'9' => {
385 self.bump();
386 let digit = u64::from(c - b'0');
387
388 if overflow!(res * 10 + digit, u64::max_value()) {
392 return self
393 .parse_long_integer(
394 nonnegative,
395 res,
396 1, )
398 .map(Token::F64);
399 }
400
401 res = res * 10 + digit;
402 }
403 _ => {
404 return self.parse_number(nonnegative, res);
405 }
406 }
407 }
408 }
409 _ => Err(Error::new(ErrorKind::Unexpected, "invalid integer")),
410 }
411 }
412
413 fn parse_long_integer(
414 &mut self,
415 nonnegative: bool,
416 significand: u64,
417 mut exponent: i32,
418 ) -> Result<f64, Error> {
419 loop {
420 match self.peek_or_nul() {
421 b'0'..=b'9' => {
422 self.bump();
423 exponent += 1;
426 }
427 b'.' => {
428 return self.parse_decimal(nonnegative, significand, exponent);
429 }
430 b'e' | b'E' => {
431 return self.parse_exponent(nonnegative, significand, exponent);
432 }
433 _ => {
434 return f64_from_parts(nonnegative, significand, exponent);
435 }
436 }
437 }
438 }
439
440 fn parse_number(&mut self, nonnegative: bool, significand: u64) -> Result<Token, Error> {
441 match self.peek_or_nul() {
442 b'.' => self
443 .parse_decimal(nonnegative, significand, 0)
444 .map(Token::F64),
445 b'e' | b'E' => self
446 .parse_exponent(nonnegative, significand, 0)
447 .map(Token::F64),
448 _ => {
449 Ok(if nonnegative {
450 Token::U64(significand)
451 } else {
452 let neg = (significand as i64).wrapping_neg();
453
454 if neg > 0 {
456 Token::F64(-(significand as f64))
457 } else {
458 Token::I64(neg)
459 }
460 })
461 }
462 }
463 }
464
465 fn parse_decimal(
466 &mut self,
467 nonnegative: bool,
468 mut significand: u64,
469 mut exponent: i32,
470 ) -> Result<f64, Error> {
471 self.bump();
472
473 let mut at_least_one_digit = false;
474 while let c @ b'0'..=b'9' = self.peek_or_nul() {
475 self.bump();
476 let digit = u64::from(c - b'0');
477 at_least_one_digit = true;
478
479 if overflow!(significand * 10 + digit, u64::max_value()) {
480 while let b'0'..=b'9' = self.peek_or_nul() {
483 self.bump();
484 }
485 break;
486 }
487
488 significand = significand * 10 + digit;
489 exponent -= 1;
490 }
491
492 if !at_least_one_digit {
493 return Err(Error::new(ErrorKind::Unexpected, "expected a digit"));
494 }
495
496 match self.peek_or_nul() {
497 b'e' | b'E' => self.parse_exponent(nonnegative, significand, exponent),
498 _ => f64_from_parts(nonnegative, significand, exponent),
499 }
500 }
501
502 fn parse_exponent(
503 &mut self,
504 nonnegative: bool,
505 significand: u64,
506 starting_exp: i32,
507 ) -> Result<f64, Error> {
508 self.bump();
509
510 let positive_exp = match self.peek_or_nul() {
511 b'+' => {
512 self.bump();
513 true
514 }
515 b'-' => {
516 self.bump();
517 false
518 }
519 _ => true,
520 };
521
522 let mut exp = match self.next_or_nul() {
523 c @ b'0'..=b'9' => i32::from(c - b'0'),
524 _ => {
525 return Err(Error::new(
526 ErrorKind::Unexpected,
527 "expected digit after exponent",
528 ));
529 }
530 };
531
532 while let c @ b'0'..=b'9' = self.peek_or_nul() {
533 self.bump();
534 let digit = i32::from(c - b'0');
535
536 if overflow!(exp * 10 + digit, i32::max_value()) {
537 return self.parse_exponent_overflow(nonnegative, significand, positive_exp);
538 }
539
540 exp = exp * 10 + digit;
541 }
542
543 let final_exp = if positive_exp {
544 starting_exp.saturating_add(exp)
545 } else {
546 starting_exp.saturating_sub(exp)
547 };
548
549 f64_from_parts(nonnegative, significand, final_exp)
550 }
551
552 #[cold]
555 #[inline(never)]
556 fn parse_exponent_overflow(
557 &mut self,
558 nonnegative: bool,
559 significand: u64,
560 positive_exp: bool,
561 ) -> Result<f64, Error> {
562 if significand != 0 && positive_exp {
564 return Err(Error::new(ErrorKind::Unexpected, "infinity takes no sign"));
565 }
566
567 while let b'0'..=b'9' = self.peek_or_nul() {
568 self.bump();
569 }
570 Ok(if nonnegative { 0.0 } else { -0.0 })
571 }
572
573 fn next_token(&mut self) -> Result<Token, Error> {
574 let peek = match self.parse_whitespace() {
575 Some(b) => b,
576 None => return Err(Error::new(ErrorKind::EndOfFile, "unexpected end of file")),
577 };
578 self.bump();
579 match peek {
580 b'"' => self.parse_str().map(Token::Str),
581 digit @ b'0'..=b'9' => self.parse_integer(true, digit),
582 b'-' => {
583 let first_digit = self.next_or_nul();
584 self.parse_integer(false, first_digit)
585 }
586 b'{' => Ok(Token::MapStart),
587 b'[' => Ok(Token::SeqStart),
588 b'}' => Ok(Token::MapEnd),
589 b']' => Ok(Token::SeqEnd),
590 b',' => Ok(Token::Comma),
591 b':' => Ok(Token::Colon),
592 b'n' => {
593 self.parse_ident(b"ull")?;
594 Ok(Token::Null)
595 }
596 b't' => {
597 self.parse_ident(b"rue")?;
598 Ok(Token::Bool(true))
599 }
600 b'f' => {
601 self.parse_ident(b"alse")?;
602 Ok(Token::Bool(false))
603 }
604 _ => Err(Error::new(ErrorKind::Unexpected, "unexpected character")),
605 }
606 }
607}
608
609fn f64_from_parts(nonnegative: bool, significand: u64, mut exponent: i32) -> Result<f64, Error> {
610 let mut f = significand as f64;
611 loop {
612 match POW10.get(exponent.abs() as usize) {
613 Some(&pow) => {
614 if exponent >= 0 {
615 f *= pow;
616 if f.is_infinite() {
617 return Err(Error::new(ErrorKind::OutOfRange, "infinite float"));
618 }
619 } else {
620 f /= pow;
621 }
622 break;
623 }
624 None => {
625 if f == 0.0 {
626 break;
627 }
628 if exponent >= 0 {
629 return Err(Error::new(ErrorKind::Unexpected, "unexpected float"));
630 }
631 f /= 1e308;
632 exponent += 308;
633 }
634 }
635 }
636 Ok(if nonnegative { f } else { -f })
637}
638
639#[allow(clippy::excessive_precision)]
641static POW10: [f64; 309] = [
642 1e000, 1e001, 1e002, 1e003, 1e004, 1e005, 1e006, 1e007, 1e008, 1e009, 1e010, 1e011, 1e012, 1e013, 1e014, 1e015, 1e016, 1e017, 1e018, 1e019, 1e020, 1e021, 1e022, 1e023, 1e024, 1e025, 1e026, 1e027, 1e028, 1e029, 1e030, 1e031, 1e032, 1e033, 1e034, 1e035, 1e036, 1e037, 1e038, 1e039, 1e040, 1e041, 1e042, 1e043, 1e044, 1e045, 1e046, 1e047, 1e048, 1e049, 1e050, 1e051, 1e052, 1e053, 1e054, 1e055, 1e056, 1e057, 1e058, 1e059, 1e060, 1e061, 1e062, 1e063, 1e064, 1e065, 1e066, 1e067, 1e068, 1e069, 1e070, 1e071, 1e072, 1e073, 1e074, 1e075, 1e076, 1e077, 1e078, 1e079, 1e080, 1e081, 1e082, 1e083, 1e084, 1e085, 1e086, 1e087, 1e088, 1e089, 1e090, 1e091, 1e092, 1e093, 1e094, 1e095, 1e096, 1e097, 1e098, 1e099, 1e100, 1e101, 1e102, 1e103, 1e104, 1e105, 1e106, 1e107, 1e108, 1e109, 1e110, 1e111, 1e112, 1e113, 1e114, 1e115, 1e116, 1e117, 1e118, 1e119, 1e120, 1e121, 1e122, 1e123, 1e124, 1e125, 1e126, 1e127, 1e128, 1e129, 1e130, 1e131, 1e132, 1e133, 1e134, 1e135, 1e136, 1e137, 1e138, 1e139, 1e140, 1e141, 1e142, 1e143, 1e144, 1e145, 1e146, 1e147, 1e148, 1e149, 1e150, 1e151, 1e152, 1e153, 1e154, 1e155, 1e156, 1e157, 1e158, 1e159, 1e160, 1e161, 1e162, 1e163, 1e164, 1e165, 1e166, 1e167, 1e168, 1e169, 1e170, 1e171, 1e172, 1e173, 1e174, 1e175, 1e176, 1e177, 1e178, 1e179, 1e180, 1e181, 1e182, 1e183, 1e184, 1e185, 1e186, 1e187, 1e188, 1e189, 1e190, 1e191, 1e192, 1e193, 1e194, 1e195, 1e196, 1e197, 1e198, 1e199, 1e200, 1e201, 1e202, 1e203, 1e204, 1e205, 1e206, 1e207, 1e208, 1e209, 1e210, 1e211, 1e212, 1e213, 1e214, 1e215, 1e216, 1e217, 1e218, 1e219, 1e220, 1e221, 1e222, 1e223, 1e224, 1e225, 1e226, 1e227, 1e228, 1e229, 1e230, 1e231, 1e232, 1e233, 1e234, 1e235, 1e236, 1e237, 1e238, 1e239, 1e240, 1e241, 1e242, 1e243, 1e244, 1e245, 1e246, 1e247, 1e248, 1e249, 1e250, 1e251, 1e252, 1e253, 1e254, 1e255, 1e256, 1e257, 1e258, 1e259, 1e260, 1e261, 1e262, 1e263, 1e264, 1e265, 1e266, 1e267, 1e268, 1e269, 1e270, 1e271, 1e272, 1e273, 1e274, 1e275, 1e276, 1e277, 1e278, 1e279, 1e280, 1e281, 1e282, 1e283, 1e284, 1e285, 1e286, 1e287, 1e288, 1e289, 1e290, 1e291, 1e292, 1e293, 1e294, 1e295, 1e296, 1e297, 1e298, 1e299, 1e300, 1e301, 1e302, 1e303, 1e304, 1e305, 1e306, 1e307, 1e308,
673];
674
675const CT: bool = true; const QU: bool = true; const BS: bool = true; const O: bool = false; #[rustfmt::skip]
683static ESCAPE: [bool; 256] = [
684 CT, CT, CT, CT, CT, CT, CT, CT, CT, CT, CT, CT, CT, CT, CT, CT, CT, CT, CT, CT, CT, CT, CT, CT, CT, CT, CT, CT, CT, CT, CT, CT, O, O, QU, O, O, O, O, O, O, O, O, O, O, O, O, O, O, O, O, O, O, O, O, O, O, O, O, O, O, O, O, O, O, O, O, O, O, O, O, O, O, O, O, O, O, O, O, O, O, O, O, O, O, O, O, O, O, O, O, O, BS, O, O, O, O, O, O, O, O, O, O, O, O, O, O, O, O, O, O, O, O, O, O, O, O, O, O, O, O, O, O, O, O, O, O, O, O, O, O, O, O, O, O, O, O, O, O, O, O, O, O, O, O, O, O, O, O, O, O, O, O, O, O, O, O, O, O, O, O, O, O, O, O, O, O, O, O, O, O, O, O, O, O, O, O, O, O, O, O, O, O, O, O, O, O, O, O, O, O, O, O, O, O, O, O, O, O, O, O, O, O, O, O, O, O, O, O, O, O, O, O, O, O, O, O, O, O, O, O, O, O, O, O, O, O, O, O, O, O, O, O, O, O, O, O, O, O, O, O, O, O, O, O, O, O, O, O, O, O, O, O, O, O, O, ];
702
703pub fn from_str<T: Deserialize>(s: &str) -> Result<T, Error> {
705 Deserializer::new(s.as_bytes()).deserialize()
706}