use std::path::PathBuf;
#[derive(thiserror::Error, Debug)]
pub enum ScanError {
#[error(transparent)]
Discovery(#[from] DiscoveryError),
#[error("workspace resolution failed: {0}")]
Workspace(#[from] WorkspaceError),
#[error("diff resolution failed: {0}")]
Diff(#[from] DiffError),
}
#[derive(thiserror::Error, Debug)]
pub enum WorkspaceError {
#[error("unknown workspace member '{name}'. Available members: {available}")]
UnknownMember { name: String, available: String },
#[error("workspace has no members")]
NoMembers,
}
#[derive(thiserror::Error, Debug)]
pub enum DiffError {
#[error("invalid ref '{name}': {reason}")]
InvalidRef { name: String, reason: String },
#[error("git is not available or directory is not a git repository")]
GitNotFound,
#[error("failed to find merge base: {0}")]
MergeBaseFailed(String),
#[error("{0}")]
Other(String),
}
#[derive(thiserror::Error, Debug)]
pub enum DiscoveryError {
#[error("cargo metadata failed: {source}")]
CargoMetadata {
#[source]
source: cargo_metadata::Error,
},
#[error("no packages found in workspace")]
NoPackages,
}
#[derive(thiserror::Error, Debug)]
pub enum PassError {
#[error("{pass}: {message}")]
Failed { pass: String, message: String },
#[error("{pass}: analysis pass panicked")]
Panicked { pass: String },
#[error("{pass}: skipped ({reason})")]
Skipped { pass: String, reason: String },
}
#[derive(thiserror::Error, Debug)]
pub enum BootstrapError {
#[error("invalid directory '{path}': {source}")]
InvalidDirectory {
path: String,
#[source]
source: std::io::Error,
},
#[error("no Cargo.toml found in '{}'", path.display())]
NoCargo { path: PathBuf },
#[error(transparent)]
Discovery(#[from] DiscoveryError),
}
#[derive(thiserror::Error, Debug)]
pub enum SetupError {
#[error(transparent)]
Prompt(#[from] dialoguer::Error),
#[error("{0}")]
NotInteractive(String),
}
#[derive(thiserror::Error, Debug)]
pub enum ConfigError {
#[error("failed to read config file '{}': {source}", path.display())]
Io {
path: std::path::PathBuf,
#[source]
source: std::io::Error,
},
#[error("failed to parse config file '{}': {source}", path.display())]
Parse {
path: std::path::PathBuf,
#[source]
source: toml::de::Error,
},
#[error("failed to parse [package.metadata.rust-doctor] in Cargo.toml: {0}")]
MetadataParse(#[from] serde_json::Error),
}