use std::fmt::{self, Display}; // Shared pub const COMMA_CHAR: u8 = b','; // Newline pub const NEWLINE_LF_CHAR: u8 = b'\n'; pub const NEWLINE_CR_CHAR: u8 = b'\r'; // Whitespace pub const WHITESPACE_TAB_CHAR: u8 = b'\t'; pub const WHITESPACE_SPACE_CHAR: u8 = b' '; // Real pub const REAL_ZERO_CHAR: u8 = b'0'; pub const REAL_NEG_CHAR: u8 = b'-'; pub const REAL_SIGEXP_SEPARATOR_CHAR: u8 = b'e'; // Text pub const TEXT_CHAR: u8 = b'"'; pub const MULTI_TEXT_CHAR: u8 = b'`'; // Kind pub const KIND_NS_SEPARATOR_CHAR: u8 = b'/'; // Tag pub const TAG_START_CHAR: u8 = b'('; pub const TAG_END_CHAR: u8 = b')'; // Dict pub const DICT_START_CHAR: u8 = b'{'; pub const DICT_END_CHAR: u8 = b'}'; pub const DICT_KV_SEPARATOR_CHAR: u8 = b':'; pub const DICT_PAIR_SEPARATOR_CHAR: u8 = COMMA_CHAR; // List pub const LIST_START_CHAR: u8 = b'['; pub const LIST_END_CHAR: u8 = b']'; pub const LIST_SEPARATOR_CHAR: u8 = COMMA_CHAR; // Comment pub const COMMENT_CHAR: u8 = b'#'; // Boolean pub const BOOLEAN_TRUE_KEYWORD: &[u8] = b"true"; pub const BOOLEAN_FALSE_KEYWORD: &[u8] = b"false"; #[derive(Clone, Debug, PartialEq)] pub enum Token { // Non-value types Newline, Whitespace, Comment, AlphaLower, AlphaUpper, // Kinds KindNsSep, // Real RealMinus, RealZero, RealNumeric, RealSigExpSep, // Text TextStart, TextEnd, MultiTextStart, MultiTextEnd, // Structures TagStart, TagEnd, DictStart, DictEnd, DictKvSep, DictPairSep, ListStart, ListEnd, ListSep } impl Token { pub fn description(&self) -> &'static str { match self { Token::Newline => "newline ''", Token::Whitespace => "whitespace ''", Token::Comment => "comment '#'", Token::AlphaLower => "alpha-lower ''", Token::AlphaUpper => "alpha-upper ''", Token::KindNsSep => "kind ns separator '/'", Token::RealMinus => "minus '-'", Token::RealZero => "zero '0'", Token::RealNumeric => "number '<0-9>'", Token::RealSigExpSep => "sig-exp separator 'e'", Token::TextStart => "text '\"'", Token::TextEnd => "text end '\"'", Token::MultiTextStart => "multi text '`'", Token::MultiTextEnd => "multi text end '`'", Token::TagStart => "tag '('", Token::TagEnd => "tag end ')'", Token::DictStart => "dict '{'", Token::DictEnd => "dict end '}'", Token::DictKvSep => "dict kv separator ':'", Token::DictPairSep => "dict pair separator ','", Token::ListStart => "list '['", Token::ListEnd => "list end ']'", Token::ListSep => "list separator ','", } } } impl Display for Token { fn fmt(&self, fmt: &mut fmt::Formatter) -> fmt::Result { write!(fmt, "{}", self.description()) } }