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}