go_flag/
error.rs

1use std::fmt;
2
3/// Common errors for flag parsing.
4#[derive(Debug)]
5pub enum FlagError {
6    /// Bad flag syntax. E.g. `--=foo`
7    BadFlag { flag: String },
8    /// Flag provided but not defined.
9    UnknownFlag { name: String },
10    /// Flag needs an argument.
11    ArgumentNeeded { name: String },
12    /// Failed to parse a flag argument. E.g. `--lines=10XYZ`
13    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/// Common warnings for flag parsing.
51#[derive(Debug)]
52pub enum FlagWarning {
53    /// Flag-like syntax appearing after argument.
54    FlagAfterArg { flag: String },
55    /// Long flag with single minus. E.g. `-lines`
56    ShortLong { flag: String },
57    /// Short flag with double minus. E.g. `--f`
58    LongShort { flag: String },
59    /// Nonstandard value format for flag argument. E.g. `--lines=0x10`
60    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/// Common errors for flag argument parsing.
90#[derive(Debug)]
91pub enum FlagParseError {
92    /// Invalid bool. E.g. `yes`
93    BoolParseError,
94    /// Invalid integer. E.g. `100XYZ`
95    IntegerParseError,
96    /// Invalid string. Invalid UTF-8 in unix-like platform or invalid UTF-16 in Windows.
97    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}