Skip to main content

jsonc_parser/
tokens.rs

1use super::common::Range;
2use super::common::Ranged;
3use std::borrow::Cow;
4
5/// A token found while scanning.
6#[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  /// Whether this token can begin a JSON value.
49  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
57/// A token with positional information.
58pub 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}