use thiserror::Error;
#[derive(Error, Debug)]
pub enum SystemAnalysisError {
#[error("System analysis failed: {message}")]
AnalysisError { message: String },
#[error("System information access failed: {source}")]
SystemInfoError {
#[source]
source: Box<dyn std::error::Error + Send + Sync>
},
#[error("Compatibility calculation failed: {message}")]
CompatibilityError { message: String },
#[error("Invalid workload requirements: {message}")]
InvalidWorkload { message: String },
#[error("Resource requirement not found: {resource_type}")]
ResourceNotFound { resource_type: String },
#[error("Configuration error: {message}")]
ConfigError { message: String },
#[error("I/O error: {0}")]
IoError(#[from] std::io::Error),
#[error("Serialization error: {0}")]
SerializationError(#[from] serde_json::Error),
#[cfg(feature = "gpu-detection")]
#[error("GPU detection error: {message}")]
GpuError { message: String },
}
impl SystemAnalysisError {
pub fn analysis(message: impl Into<String>) -> Self {
Self::AnalysisError {
message: message.into(),
}
}
pub fn system_info(message: impl Into<String>) -> Self {
Self::SystemInfoError {
source: Box::new(std::io::Error::other(
message.into()
)),
}
}
pub fn compatibility(message: impl Into<String>) -> Self {
Self::CompatibilityError {
message: message.into(),
}
}
pub fn invalid_workload(message: impl Into<String>) -> Self {
Self::InvalidWorkload {
message: message.into(),
}
}
pub fn resource_not_found(resource_type: impl Into<String>) -> Self {
Self::ResourceNotFound {
resource_type: resource_type.into(),
}
}
pub fn config(message: impl Into<String>) -> Self {
Self::ConfigError {
message: message.into(),
}
}
#[cfg(feature = "gpu-detection")]
pub fn gpu(message: impl Into<String>) -> Self {
Self::GpuError {
message: message.into(),
}
}
}
pub type Result<T> = std::result::Result<T, SystemAnalysisError>;