rpn_cli/
error.rs

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