use std::fmt::{Display, Formatter};
use std::io;
use rustyline::error::ReadlineError;
use thiserror::Error;
pub type MyResult<T> = Result<T, MyError>;
#[derive(Error, Debug, PartialEq)]
pub enum EngineError {
ParseError(String),
MissingValue,
MissingUndo,
MissingRedo,
MissingClip,
BadTimeOp,
}
impl Display for EngineError {
fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result {
match self {
EngineError::ParseError(token) => write!(f, "Invalid number or keyword: {}", token),
EngineError::MissingValue => write!(f, "Not enough values on stack"),
EngineError::MissingUndo => write!(f, "Start of undo history"),
EngineError::MissingRedo => write!(f, "End of undo history"),
EngineError::MissingClip => write!(f, "No value on clipboard"),
EngineError::BadTimeOp => write!(f, "Unsupported time operation"),
}
}
}
#[derive(Error, Debug)]
pub enum MyError {
#[error(transparent)]
Clap(#[from] clap::error::Error),
#[error(transparent)]
Io(#[from] io::Error),
#[error(transparent)]
ParseBigInt(#[from] num::bigint::ParseBigIntError),
#[error(transparent)]
ParseBigRatio(#[from] big_rational_str::ParseError),
#[error(transparent)]
Readline(#[from] ReadlineError),
#[error(transparent)]
Engine(#[from] EngineError),
}