use std::fmt;
use std::path::PathBuf;
#[non_exhaustive]
#[derive(Debug)]
pub enum LinkDiagnostics {
MissingLean {
tried: Vec<String>,
},
MissingHeader {
path: PathBuf,
},
MissingLib {
name: String,
search_dirs: Vec<PathBuf>,
},
VersionMismatch {
expected: String,
actual: String,
},
AllowlistFailure {
name: &'static str,
},
FixtureArtifactMissing {
path: PathBuf,
recovery: &'static str,
},
UnsupportedToolchain {
active: String,
supported_window: String,
},
}
impl fmt::Display for LinkDiagnostics {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
match self {
Self::MissingLean { tried } => {
let joined = tried.join("; ");
write!(f, "lean-toolchain: no Lean toolchain found; tried: {joined}")
}
Self::MissingHeader { path } => {
write!(f, "lean-toolchain: missing Lean header at {}", path.display())
}
Self::MissingLib { name, search_dirs } => {
let dirs = search_dirs
.iter()
.map(|p| p.display().to_string())
.collect::<Vec<_>>()
.join(":");
write!(f, "lean-toolchain: missing Lean library `{name}` (searched: {dirs})")
}
Self::VersionMismatch { expected, actual } => {
write!(
f,
"lean-toolchain: Lean version mismatch: built against {expected}, discovered {actual}"
)
}
Self::AllowlistFailure { name } => {
write!(f, "lean-toolchain: required symbol `{name}` failed to resolve")
}
Self::FixtureArtifactMissing { path, recovery } => {
write!(
f,
"lean-toolchain: missing fixture artifact {} (recovery: {recovery})",
path.display()
)
}
Self::UnsupportedToolchain {
active,
supported_window,
} => {
write!(
f,
"lean-toolchain: active Lean toolchain {active} is not in the supported window: {supported_window}"
)
}
}
}
}
impl std::error::Error for LinkDiagnostics {}