deser_json/
de.rs

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
29/// Deserializes a serializable from JSON.
30pub 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    /// Creates a new deserializer.
43    pub fn new(input: &'a [u8]) -> Deserializer<'a> {
44        Deserializer {
45            input,
46            pos: 0,
47            buffer: Vec::new(),
48        }
49    }
50
51    /// Deserializes the value.
52    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            // try to exit containers first
68            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                    // do we need a comma?
83                    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                    // handle keys
98                    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            // The input is assumed to be valid UTF-8 and the \u-escapes are
204            // checked along the way, so don't need to check here.
205            unsafe { str::from_utf8_unchecked(bytes) }
206        }
207
208        // Index of the first byte not yet copied into the scratch space.
209        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                        // Fast path: return a slice of the raw JSON without any
226                        // copying.
227                        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    /// Parses a JSON escape sequence and appends it into the scratch space. Assumes
258    /// the previous byte read was a backslash.
259    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                    // Non-BMP characters are encoded as a sequence of
278                    // two hex escapes, representing UTF-16 surrogates.
279                    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                            // We need to be careful with overflow. If we can, try to keep the
389                            // number as a `u64` until we grow too large. At that point, switch to
390                            // parsing the value as a `f64`.
391                            if overflow!(res * 10 + digit, u64::max_value()) {
392                                return self
393                                    .parse_long_integer(
394                                        nonnegative,
395                                        res,
396                                        1, // res * 10^1
397                                    )
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                    // This could overflow... if your integer is gigabytes long.
424                    // Ignore that possibility.
425                    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                    // Convert into a float if we underflow.
455                    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                // The next multiply/add would overflow, so just ignore all
481                // further digits.
482                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    // This cold code should not be inlined into the middle of the hot
553    // exponent-parsing loop above.
554    #[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        // Error instead of +/- infinity.
563        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// Clippy bug: https://github.com/rust-lang/rust-clippy/issues/5201
640#[allow(clippy::excessive_precision)]
641static POW10: [f64; 309] = [
642    1e000, 1e001, 1e002, 1e003, 1e004, 1e005, 1e006, 1e007, 1e008, 1e009, //
643    1e010, 1e011, 1e012, 1e013, 1e014, 1e015, 1e016, 1e017, 1e018, 1e019, //
644    1e020, 1e021, 1e022, 1e023, 1e024, 1e025, 1e026, 1e027, 1e028, 1e029, //
645    1e030, 1e031, 1e032, 1e033, 1e034, 1e035, 1e036, 1e037, 1e038, 1e039, //
646    1e040, 1e041, 1e042, 1e043, 1e044, 1e045, 1e046, 1e047, 1e048, 1e049, //
647    1e050, 1e051, 1e052, 1e053, 1e054, 1e055, 1e056, 1e057, 1e058, 1e059, //
648    1e060, 1e061, 1e062, 1e063, 1e064, 1e065, 1e066, 1e067, 1e068, 1e069, //
649    1e070, 1e071, 1e072, 1e073, 1e074, 1e075, 1e076, 1e077, 1e078, 1e079, //
650    1e080, 1e081, 1e082, 1e083, 1e084, 1e085, 1e086, 1e087, 1e088, 1e089, //
651    1e090, 1e091, 1e092, 1e093, 1e094, 1e095, 1e096, 1e097, 1e098, 1e099, //
652    1e100, 1e101, 1e102, 1e103, 1e104, 1e105, 1e106, 1e107, 1e108, 1e109, //
653    1e110, 1e111, 1e112, 1e113, 1e114, 1e115, 1e116, 1e117, 1e118, 1e119, //
654    1e120, 1e121, 1e122, 1e123, 1e124, 1e125, 1e126, 1e127, 1e128, 1e129, //
655    1e130, 1e131, 1e132, 1e133, 1e134, 1e135, 1e136, 1e137, 1e138, 1e139, //
656    1e140, 1e141, 1e142, 1e143, 1e144, 1e145, 1e146, 1e147, 1e148, 1e149, //
657    1e150, 1e151, 1e152, 1e153, 1e154, 1e155, 1e156, 1e157, 1e158, 1e159, //
658    1e160, 1e161, 1e162, 1e163, 1e164, 1e165, 1e166, 1e167, 1e168, 1e169, //
659    1e170, 1e171, 1e172, 1e173, 1e174, 1e175, 1e176, 1e177, 1e178, 1e179, //
660    1e180, 1e181, 1e182, 1e183, 1e184, 1e185, 1e186, 1e187, 1e188, 1e189, //
661    1e190, 1e191, 1e192, 1e193, 1e194, 1e195, 1e196, 1e197, 1e198, 1e199, //
662    1e200, 1e201, 1e202, 1e203, 1e204, 1e205, 1e206, 1e207, 1e208, 1e209, //
663    1e210, 1e211, 1e212, 1e213, 1e214, 1e215, 1e216, 1e217, 1e218, 1e219, //
664    1e220, 1e221, 1e222, 1e223, 1e224, 1e225, 1e226, 1e227, 1e228, 1e229, //
665    1e230, 1e231, 1e232, 1e233, 1e234, 1e235, 1e236, 1e237, 1e238, 1e239, //
666    1e240, 1e241, 1e242, 1e243, 1e244, 1e245, 1e246, 1e247, 1e248, 1e249, //
667    1e250, 1e251, 1e252, 1e253, 1e254, 1e255, 1e256, 1e257, 1e258, 1e259, //
668    1e260, 1e261, 1e262, 1e263, 1e264, 1e265, 1e266, 1e267, 1e268, 1e269, //
669    1e270, 1e271, 1e272, 1e273, 1e274, 1e275, 1e276, 1e277, 1e278, 1e279, //
670    1e280, 1e281, 1e282, 1e283, 1e284, 1e285, 1e286, 1e287, 1e288, 1e289, //
671    1e290, 1e291, 1e292, 1e293, 1e294, 1e295, 1e296, 1e297, 1e298, 1e299, //
672    1e300, 1e301, 1e302, 1e303, 1e304, 1e305, 1e306, 1e307, 1e308,
673];
674
675const CT: bool = true; // control character \x00..=\x1F
676const QU: bool = true; // quote \x22
677const BS: bool = true; // backslash \x5C
678const O: bool = false; // allow unescaped
679
680// Lookup table of bytes that must be escaped. A value of true at index i means
681// that byte i requires an escape sequence in the input.
682#[rustfmt::skip]
683static ESCAPE: [bool; 256] = [
684    //   1   2   3   4   5   6   7   8   9   A   B   C   D   E   F
685    CT, CT, CT, CT, CT, CT, CT, CT, CT, CT, CT, CT, CT, CT, CT, CT, // 0
686    CT, CT, CT, CT, CT, CT, CT, CT, CT, CT, CT, CT, CT, CT, CT, CT, // 1
687     O,  O, QU,  O,  O,  O,  O,  O,  O,  O,  O,  O,  O,  O,  O,  O, // 2
688     O,  O,  O,  O,  O,  O,  O,  O,  O,  O,  O,  O,  O,  O,  O,  O, // 3
689     O,  O,  O,  O,  O,  O,  O,  O,  O,  O,  O,  O,  O,  O,  O,  O, // 4
690     O,  O,  O,  O,  O,  O,  O,  O,  O,  O,  O,  O, BS,  O,  O,  O, // 5
691     O,  O,  O,  O,  O,  O,  O,  O,  O,  O,  O,  O,  O,  O,  O,  O, // 6
692     O,  O,  O,  O,  O,  O,  O,  O,  O,  O,  O,  O,  O,  O,  O,  O, // 7
693     O,  O,  O,  O,  O,  O,  O,  O,  O,  O,  O,  O,  O,  O,  O,  O, // 8
694     O,  O,  O,  O,  O,  O,  O,  O,  O,  O,  O,  O,  O,  O,  O,  O, // 9
695     O,  O,  O,  O,  O,  O,  O,  O,  O,  O,  O,  O,  O,  O,  O,  O, // A
696     O,  O,  O,  O,  O,  O,  O,  O,  O,  O,  O,  O,  O,  O,  O,  O, // B
697     O,  O,  O,  O,  O,  O,  O,  O,  O,  O,  O,  O,  O,  O,  O,  O, // C
698     O,  O,  O,  O,  O,  O,  O,  O,  O,  O,  O,  O,  O,  O,  O,  O, // D
699     O,  O,  O,  O,  O,  O,  O,  O,  O,  O,  O,  O,  O,  O,  O,  O, // E
700     O,  O,  O,  O,  O,  O,  O,  O,  O,  O,  O,  O,  O,  O,  O,  O, // F
701];
702
703/// Deserializes JSON from the given string.
704pub fn from_str<T: Deserialize>(s: &str) -> Result<T, Error> {
705    Deserializer::new(s.as_bytes()).deserialize()
706}