1use super::common::Range;
2use super::common::Ranged;
3use std::borrow::Cow;
4
5#[derive(Debug, PartialEq, Clone)]
7pub enum Token<'a> {
8 OpenBrace,
9 CloseBrace,
10 OpenBracket,
11 CloseBracket,
12 Comma,
13 Colon,
14 String(Cow<'a, str>),
15 Word(&'a str),
16 Boolean(bool),
17 Number(&'a str),
18 Null,
19 CommentLine(&'a str),
20 CommentBlock(&'a str),
21}
22
23impl<'a> Token<'a> {
24 pub fn as_str(&self) -> &str {
25 match self {
26 Token::OpenBrace => "{",
27 Token::CloseBrace => "}",
28 Token::OpenBracket => "[",
29 Token::CloseBracket => "]",
30 Token::Comma => ",",
31 Token::Colon => ":",
32 Token::String(value) => value,
33 Token::Word(value) => value,
34 Token::Boolean(value) => {
35 if *value {
36 "true"
37 } else {
38 "false"
39 }
40 }
41 Token::Number(value) => value,
42 Token::Null => "null",
43 Token::CommentLine(value) => value,
44 Token::CommentBlock(value) => value,
45 }
46 }
47}
48
49pub struct TokenAndRange<'a> {
51 pub range: Range,
52 pub token: Token<'a>,
53}
54
55impl<'a> Ranged for TokenAndRange<'a> {
56 fn range(&self) -> Range {
57 self.range
58 }
59}