use std::fmt::Display; #[derive(Debug, PartialEq, Clone, Copy)] pub enum TokenType { LeftParen, RightParen, LeftBrace, RightBrace, Comma, Dot, Minus, Plus, Semicolon, Slash, Star, Bang, BangEqual, Equal, EqualEqual, Greater, GreaterEqual, Less, LessEqual, Identifier, String, Number, And, Class, Else, False, Fun, For, If, Nil, OR, Print, Return, Super, This, True, Var, While, EOF, } // i've seen this implementation in the wild #[derive(Debug, Clone, PartialEq)] pub enum LiteralType { String(String), Number(f64), } #[derive(Debug)] pub struct Token { pub t_type: TokenType, pub lexeme: String, pub literal: Option, pub line: usize, } impl Display for Token { fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { write!(f, "{:?} {} {:?}", self.t_type, self.lexeme, self.literal) } }