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 pub(crate) fn is_value_start(&self) -> bool {
50 matches!(
51 self,
52 Token::OpenBrace | Token::OpenBracket | Token::String(_) | Token::Boolean(_) | Token::Number(_) | Token::Null
53 )
54 }
55}
56
57pub struct TokenAndRange<'a> {
59 pub range: Range,
60 pub token: Token<'a>,
61}
62
63impl<'a> Ranged for TokenAndRange<'a> {
64 fn range(&self) -> Range {
65 self.range
66 }
67}