1use crate::{ArgCount, ArgType, Span};
2
3pub struct Error {
4 pub span: Span,
5 pub kind: ErrorKind,
6}
7
8pub enum ErrorKind {
9 ParseIntError(std::num::ParseIntError),
11
12 SameFlagMultipleTimes(String, String),
14
15 MissingArgument(String, ArgType),
17
18 WrongArgCount {
19 expected: ArgCount,
20 got: usize,
21 },
22 MissingFlag(String),
23
24 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}