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  /// The text of a token that can be an unquoted property name, which in JSON5 includes `true`, `false` and `null`.
49  pub(crate) fn as_loose_property_name(&self) -> Option<&'a str> {
50    match self {
51      Token::Word(value) | Token::Number(value) => Some(value),
52      Token::Boolean(true) => Some("true"),
53      Token::Boolean(false) => Some("false"),
54      Token::Null => Some("null"),
55      _ => None,
56    }
57  }
58
59  /// Whether this token can begin a JSON value.
60  pub(crate) fn is_value_start(&self) -> bool {
61    matches!(
62      self,
63      Token::OpenBrace | Token::OpenBracket | Token::String(_) | Token::Boolean(_) | Token::Number(_) | Token::Null
64    )
65  }
66}
67
68/// A token with positional information.
69pub struct TokenAndRange<'a> {
70  pub range: Range,
71  pub token: Token<'a>,
72}
73
74impl<'a> Ranged for TokenAndRange<'a> {
75  fn range(&self) -> Range {
76    self.range
77  }
78}