use std::ffi::OsString;
use std::fmt;
use std::num::ParseIntError;
#[derive(PartialEq, Eq, Debug)]
pub enum OptionsError {
BadArgument(&'static str, OsString),
Unsupported(String),
Duplicate(&'static str, &'static str),
Conflict(&'static str, &'static str),
Useless(&'static str, bool, &'static str),
Useless2(&'static str, &'static str, &'static str),
TreeAllAll,
FailedParse(String, NumberSource, ParseIntError),
FailedGlobPattern(String),
}
#[derive(PartialEq, Eq, Debug)]
pub enum NumberSource {
Arg(&'static str),
Env(&'static str),
}
impl From<glob::PatternError> for OptionsError {
fn from(error: glob::PatternError) -> Self {
Self::FailedGlobPattern(error.to_string())
}
}
impl fmt::Display for NumberSource {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
match self {
Self::Arg(arg) => write!(f, "option {arg}"),
Self::Env(env) => write!(f, "environment variable {env}"),
}
}
}
impl fmt::Display for OptionsError {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
#[rustfmt::skip]
return match self {
Self::BadArgument(arg, _) => write!(f, "Bad argument for {arg}"),
Self::Unsupported(e) => write!(f, "{e}"),
Self::Conflict(a, b) => write!(f, "Option {a} conflicts with option {b}"),
Self::Duplicate(a, b) if a == b => write!(f, "Flag {a} was given twice"),
Self::Duplicate(a, b) => write!(f, "Flag {a} conflicts with flag {b}"),
Self::Useless(a, false, b) => write!(f, "Option {a} is useless without option {b}"),
Self::Useless(a, true, b) => write!(f, "Option {a} is useless given option {b}"),
Self::Useless2(a, b1, b2) => write!(f, "Option {a} is useless without options {b1} or {b2}"),
Self::TreeAllAll => write!(f, "Option --tree is useless given --all --all"),
Self::FailedParse(s, n, e) => write!(f, "Value {s:?} not valid for {n}: {e}"),
Self::FailedGlobPattern(e) => write!(f, "Failed to parse glob pattern: {e}"),
};
}
}