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