rpn_cli/
error.rs

1use rustyline::error::ReadlineError;
2use std::fmt::{Display, Formatter};
3use std::io;
4use std::num::ParseIntError;
5use thiserror::Error;
6
7pub type MyResult<T> = Result<T, MyError>;
8
9#[derive(Error, Debug, PartialEq)]
10pub enum EngineError {
11    ParseError(String),
12    MissingValue,
13    MissingUndo,
14    MissingRedo,
15    MissingClip,
16    BadTimeOp,
17}
18
19impl Display for EngineError {
20    fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result {
21        match self {
22            Self::ParseError(token) => write!(f, "Invalid number or keyword: {}", token),
23            Self::MissingValue => write!(f, "Not enough values on stack"),
24            Self::MissingUndo => write!(f, "Start of undo history"),
25            Self::MissingRedo => write!(f, "End of undo history"),
26            Self::MissingClip => write!(f, "No value on clipboard"),
27            Self::BadTimeOp => write!(f, "Unsupported time operation"),
28        }
29    }
30}
31
32#[derive(Error, Debug)]
33pub enum MyError {
34    #[error(transparent)]
35    Chrono(#[from] chrono::ParseError),
36    #[error(transparent)]
37    Clap(#[from] clap::error::Error),
38    #[error(transparent)]
39    Io(#[from] io::Error),
40    #[error(transparent)]
41    ParseBigInt(#[from] num::bigint::ParseBigIntError),
42    #[error(transparent)]
43    ParseBigRatio(#[from] big_rational_str::ParseError),
44    #[error(transparent)]
45    ParseInt(#[from] ParseIntError),
46    #[error(transparent)]
47    Readline(#[from] ReadlineError),
48    #[error(transparent)]
49    Engine(#[from] EngineError),
50}