ragit_cli/
error.rs

1use crate::{ArgCount, ArgType, Span};
2
3pub struct Error {
4    pub span: Span,
5    pub kind: ErrorKind,
6}
7
8pub enum ErrorKind {
9    /// see <https://doc.rust-lang.org/stable/std/num/struct.ParseIntError.html>
10    ParseIntError(std::num::ParseIntError),
11
12    /// (prev_flag, curr_flag)
13    SameFlagMultipleTimes(String, String),
14
15    /// of an arg_flag
16    MissingArgument(String, ArgType),
17
18    WrongArgCount {
19        expected: ArgCount,
20        got: usize,
21    },
22    MissingFlag(String),
23
24    // TODO: suggest similar names
25    UnknownFlag(String),
26}
27
28impl ErrorKind {
29    pub fn render(&self) -> String {
30        match self {
31            ErrorKind::ParseIntError(_) => String::from("Cannot parse int."),
32            ErrorKind::SameFlagMultipleTimes(prev, next) => if prev == next {
33                format!("Flag `{next}` cannot be used multiple times.")
34            } else {
35                format!("Flag `{prev}` and `{next}` cannot be used together.")
36            },
37            ErrorKind::MissingArgument(arg, arg_type) => format!(
38                "A {} value is required for flag `{arg}`, but is missing.",
39                format!("{arg_type:?}").to_ascii_lowercase(),
40            ),
41            ErrorKind::WrongArgCount { expected, got } => format!(
42                "Expected {} arguments, got {got} arguments",
43                match expected {
44                    ArgCount::Exact(n) => format!("exactly {n}"),
45                    ArgCount::Geq(n) => format!("at least {n}"),
46                    ArgCount::Leq(n) => format!("at most {n}"),
47                    ArgCount::None => String::from("no"),
48                    ArgCount::Any => unreachable!(),
49                },
50            ),
51            ErrorKind::MissingFlag(flag) => format!("Flag `{flag}` is missing."),
52            ErrorKind::UnknownFlag(flag) => format!("Unknown flag: `{flag}`."),
53        }
54    }
55}