1use std::fmt;
2
3#[derive(Clone, Copy, Debug, PartialEq, Eq)]
4pub enum CliErrorKind {
5 InvalidInput,
6 InvalidSpecification,
7 UnknownOption,
8 UnexpectedArgument,
9 MissingCommand,
10 MissingOption,
11 MissingValue,
12 InvalidValue,
13 DuplicateOption,
14 OptionConflict,
15 MissingRequirement,
16}
17
18#[derive(Clone, Debug, PartialEq, Eq)]
19pub struct CliError {
20 kind: CliErrorKind,
21 message: String,
22}
23
24impl CliError {
25 pub fn new(kind: CliErrorKind, message: impl Into<String>) -> Self {
26 Self {
27 kind,
28 message: message.into(),
29 }
30 }
31
32 pub fn kind(&self) -> CliErrorKind {
33 self.kind
34 }
35}
36
37impl fmt::Display for CliError {
38 fn fmt(&self, formatter: &mut fmt::Formatter<'_>) -> fmt::Result {
39 formatter.write_str(&self.message)
40 }
41}
42
43impl std::error::Error for CliError {}