use std::{ error, fmt, num::{ParseFloatError, ParseIntError}, rc::Rc, }; #[derive(Clone, Debug, PartialEq, Eq)] pub enum Error { // Number InvalidFloatLiteral(Rc, ParseFloatError), InvalidIntegerLiteral(Rc, ParseIntError), // String UnclosedString(Rc), UnexpectedEscapeChar(char), // Par UnexpectedRightPar, UnclosedLeftPar, UnexpectedEof, RecursionLimit, } impl fmt::Display for Error { fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { match self { Error::InvalidFloatLiteral(number, err) => { write!(f, "invalid float literal {number}: {err}") } Error::InvalidIntegerLiteral(number, err) => { write!(f, "invalid integer literal {number}: {err}") } Error::UnclosedString(string) => write!(f, "unclosed string {string:?}"), Error::UnexpectedEscapeChar(ch) => write!(f, "unexpected escape char {ch:?}"), Error::UnexpectedRightPar => write!(f, "unexpected right par"), Error::UnclosedLeftPar => write!(f, "unclosed left par"), Error::UnexpectedEof => write!(f, "unexpected eof"), Error::RecursionLimit => write!(f, "recursion limit"), } } } impl error::Error for Error {}