use thiserror::Error;
#[derive(Error, Debug)]
pub enum MsvcKitError {
#[error("Network error: {0}")]
Network(#[from] reqwest::Error),
#[error("Download failed for {file} ({url}): {source}")]
DownloadNetwork {
file: String,
url: String,
#[source]
source: reqwest::Error,
},
#[error("IO error: {0}")]
Io(#[from] std::io::Error),
#[error("JSON parsing error: {0}")]
Json(#[from] serde_json::Error),
#[error("JSON parsing error: {0}")]
SimdJson(#[from] simd_json::Error),
#[error("TOML parsing error: {0}")]
TomlDe(#[from] toml::de::Error),
#[error("TOML serialization error: {0}")]
TomlSer(#[from] toml::ser::Error),
#[error("Database error: {0}")]
Database(String),
#[error("Serialization error: {0}")]
Serialization(String),
#[error("ZIP extraction error: {0}")]
Zip(#[from] zip::result::ZipError),
#[error("CAB extraction error: {0}")]
Cab(String),
#[error("Configuration error: {0}")]
Config(String),
#[error("Version not found: {0}")]
VersionNotFound(String),
#[error("Component not found: {0}")]
ComponentNotFound(String),
#[error("Installation path error: {0}")]
InstallPath(String),
#[error("Environment setup error: {0}")]
EnvSetup(String),
#[error("Hash verification failed for {file}: expected {expected}, got {actual}")]
HashMismatch {
file: String,
expected: String,
actual: String,
},
#[error("Platform not supported: {0}")]
UnsupportedPlatform(String),
#[error("Download cancelled by user")]
Cancelled,
#[error("{0}")]
Other(String),
}
pub type Result<T> = std::result::Result<T, MsvcKitError>;
impl From<String> for MsvcKitError {
fn from(s: String) -> Self {
MsvcKitError::Other(s)
}
}
impl From<&str> for MsvcKitError {
fn from(s: &str) -> Self {
MsvcKitError::Other(s.to_string())
}
}