use std::fmt;
#[derive(Debug)]
pub(crate) enum ToolError {
Missing {
program: &'static str,
source: std::io::Error,
},
ProbeFailed {
program: &'static str,
status: std::process::ExitStatus,
},
InvalidOutput {
program: &'static str,
},
MissingProjectExecutable {
path: std::path::PathBuf,
advice: &'static str,
},
}
impl fmt::Display for ToolError {
fn fmt(&self, formatter: &mut fmt::Formatter<'_>) -> fmt::Result {
match self {
Self::Missing { program, source } => write!(
formatter,
"required tool `{program}` is unavailable: {source}"
),
Self::ProbeFailed { program, status } => {
write!(formatter, "tool `{program} --version` failed with {status}")
}
Self::InvalidOutput { program } => write!(
formatter,
"tool `{program}` returned an unrecognized version"
),
Self::MissingProjectExecutable { path, advice } => write!(
formatter,
"required project executable `{}` is missing; {advice}",
path.display()
),
}
}
}
impl std::error::Error for ToolError {
fn source(&self) -> Option<&(dyn std::error::Error + 'static)> {
match self {
Self::Missing { source, .. } => Some(source),
_ => None,
}
}
}