1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34
use std::fmt; #[derive(Clone, Copy)] pub struct Token<'a> { pub line: u32, pub col: u32, pub text: &'a str, } impl<'a> fmt::Display for Token<'a> { fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { write!(f, "<{}>", self.text.escape_default().collect::<String>()) } } impl<'a> fmt::Debug for Token<'a> { fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { write!(f, "<{}>", self.text.escape_default().collect::<String>()) } } impl<'a> Token<'a> { pub fn new(line: u32, col: u32, text: &'a str) -> Token<'a> { Token { line, col, text } } pub fn inner_str(&self) -> Option<Token> { if self.text.starts_with('"') && self.text.ends_with('"') { Some(Token::new(self.line, self.col, &self.text[1..self.text.len()-1])) } else { None } } }