1#![allow(clippy::identity_op, clippy::just_underscores_and_digits)]
2
3use core::fmt;
4
5#[derive(Debug, Clone, Copy)]
7#[repr(u8)]
8pub enum Token {
9 Comma = CM,
11 Colon = CL,
13 Whitespace = WS,
15 OpenBrace = OB,
17 CloseBrace = CB,
19 OpenBracket = OA,
21 CloseBracket = CA,
23 String = ST,
25 Number = NM,
27 Null = NU,
29 True = TR,
31 False = FL,
33 Error = __,
35 Eof = EF,
37}
38
39impl Token {
40 #[inline]
45 pub(crate) fn from_byte(b: u8) -> Token {
46 match MAP[b as usize] {
47 WS => Token::Whitespace,
48 OA => Token::OpenBrace,
49 CA => Token::CloseBrace,
50 OB => Token::OpenBracket,
51 CB => Token::CloseBracket,
52 CM => Token::Comma,
53 CL => Token::Colon,
54 ST => Token::String,
55 NM => Token::Number,
56 NU => Token::Null,
57 TR => Token::True,
58 FL => Token::False,
59 __ => Token::Error,
60 _ => unreachable!(),
61 }
62 }
63
64 #[inline]
65 pub(crate) fn is_value(&self) -> bool {
66 (*self as u8) & VAL_BIT != 0
67 }
68
69 #[inline]
70 pub(crate) fn is_null(&self) -> bool {
71 matches!(self, Token::Null)
72 }
73}
74
75impl fmt::Display for Token {
76 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
77 match self {
78 Token::Comma => write!(f, "`,`"),
79 Token::Colon => write!(f, "`:`"),
80 Token::Whitespace => write!(f, "<whitespace>"),
81 Token::OpenBrace => write!(f, "`{{`"),
82 Token::CloseBrace => write!(f, "`}}`"),
83 Token::OpenBracket => write!(f, "`[`"),
84 Token::CloseBracket => write!(f, "`]`"),
85 Token::String => write!(f, "`\"`"),
86 Token::Number => write!(f, "<number>"),
87 Token::Null => write!(f, "null"),
88 Token::True => write!(f, "true"),
89 Token::False => write!(f, "false"),
90 Token::Error => write!(f, "<error>"),
91 Token::Eof => write!(f, "<eof>"),
92 }
93 }
94}
95
96const VAL_BIT: u8 = 0b0000_0001;
97const CTL_BIT: u8 = 0b0000_0010;
98
99const WS: u8 = 0b0000_0000;
100const OA: u8 = 0b0001_0000 | VAL_BIT;
101const CA: u8 = 0b0010_0000;
102const OB: u8 = 0b0011_0000 | VAL_BIT;
103const CB: u8 = 0b0100_0000;
104const NM: u8 = 0b0101_0000 | VAL_BIT;
105const ST: u8 = 0b0111_0000 | VAL_BIT;
106const NU: u8 = 0b1000_0000 | VAL_BIT;
107const TR: u8 = 0b1001_0000 | VAL_BIT;
108const FL: u8 = 0b1010_0000 | VAL_BIT;
109const CM: u8 = 0b0000_0000 | CTL_BIT;
110const CL: u8 = 0b0001_0000 | CTL_BIT;
111const EF: u8 = 0b1110_0000 | CTL_BIT;
112const __: u8 = 0b1111_0000 | CTL_BIT;
113
114static MAP: [u8; 256] = [
115 __, __, __, __, __, __, __, __, __, WS, WS, __, WS, WS, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, WS, __, ST, __, __, __, __, __, __, __, __, __, CM, NM, __, __, NM, NM, NM, NM, NM, NM, NM, NM, NM, NM, CL, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, OB, __, CB, __, __, __, __, __, __, __, __, FL, __, __, __, __, __, __, __, NU, __, __, __, __, __, TR, __, __, __, __, __, __, OA, __, CA, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, ];