1use std::fmt;
2
3#[derive(Debug)]
5pub enum FlagError {
6 BadFlag { flag: String },
8 UnknownFlag { name: String },
10 ArgumentNeeded { name: String },
12 ParseError { error: FlagParseError },
14}
15
16impl fmt::Display for FlagError {
17 fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
18 use FlagError::*;
19 match self {
20 BadFlag { flag } => write!(f, "bad flag syntax: {}", flag),
21 UnknownFlag { name } => write!(f, "flag provided but not defined: -{}", name),
22 ArgumentNeeded { name } => write!(f, "flag needs an argument: -{}", name),
23 ParseError { .. } => write!(f, "parse error"),
24 }
25 }
26}
27
28impl std::error::Error for FlagError {
29 fn description(&self) -> &str {
30 use FlagError::*;
31 match self {
32 BadFlag { .. } => "bad flag syntax",
33 UnknownFlag { .. } => "flag provided but not defined",
34 ArgumentNeeded { .. } => "flag needs an argument",
35 ParseError { .. } => "parse error",
36 }
37 }
38
39 fn source(&self) -> Option<&(dyn std::error::Error + 'static)> {
40 use FlagError::*;
41 match self {
42 BadFlag { .. } => None,
43 UnknownFlag { .. } => None,
44 ArgumentNeeded { .. } => None,
45 ParseError { error } => Some(error),
46 }
47 }
48}
49
50#[derive(Debug)]
52pub enum FlagWarning {
53 FlagAfterArg { flag: String },
55 ShortLong { flag: String },
57 LongShort { flag: String },
59 FlagValue { value: String },
61}
62
63impl fmt::Display for FlagWarning {
64 fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
65 use FlagWarning::*;
66 match self {
67 FlagAfterArg { flag } => {
68 write!(f, "flag-like syntax appearing after argument: {}", flag)
69 }
70 ShortLong { flag } => write!(f, "long flag with single minus: {}", flag),
71 LongShort { flag } => write!(f, "short flag with double minuses: {}", flag),
72 FlagValue { value } => write!(f, "nonstandard value format: {}", value),
73 }
74 }
75}
76
77impl std::error::Error for FlagWarning {
78 fn description(&self) -> &str {
79 use FlagWarning::*;
80 match self {
81 FlagAfterArg { .. } => "flag-like syntax appearing after argument",
82 ShortLong { .. } => "long flag with single minus",
83 LongShort { .. } => "short flag with double minuses",
84 FlagValue { .. } => "nonstandard value format: {}",
85 }
86 }
87}
88
89#[derive(Debug)]
91pub enum FlagParseError {
92 BoolParseError,
94 IntegerParseError,
96 StringParseError,
98}
99
100impl fmt::Display for FlagParseError {
101 fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
102 use FlagParseError::*;
103 match self {
104 BoolParseError => write!(f, "invalid bool"),
105 IntegerParseError => write!(f, "invalid integer"),
106 StringParseError => write!(f, "invalid unicode string"),
107 }
108 }
109}
110
111impl std::error::Error for FlagParseError {
112 fn description(&self) -> &str {
113 use FlagParseError::*;
114 match self {
115 BoolParseError => "invalid bool",
116 IntegerParseError => "invalid integer",
117 StringParseError => "invalid unicode string",
118 }
119 }
120}