use std::fmt;
#[derive(Debug, Clone)]
pub enum DomainError {
HardwareCollectionFailed(String),
SystemInfoUnavailable(String),
InsufficientPrivileges(String),
InvalidConfiguration(String),
MissingDependencies(Vec<String>),
ParsingFailed(String),
Timeout(String),
}
impl fmt::Display for DomainError {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
match self {
DomainError::HardwareCollectionFailed(msg) => {
write!(f, "Hardware collection failed: {msg}")
}
DomainError::SystemInfoUnavailable(msg) => {
write!(f, "System information unavailable: {msg}")
}
DomainError::InsufficientPrivileges(msg) => {
write!(f, "Insufficient privileges: {msg}")
}
DomainError::InvalidConfiguration(msg) => {
write!(f, "Invalid configuration: {msg}")
}
DomainError::MissingDependencies(deps) => {
write!(f, "Missing required dependencies: {}", deps.join(", "))
}
DomainError::ParsingFailed(msg) => {
write!(f, "Data parsing failed: {msg}")
}
DomainError::Timeout(msg) => {
write!(f, "Operation timed out: {msg}")
}
}
}
}
impl std::error::Error for DomainError {}
#[derive(Debug, Clone)]
pub enum ReportError {
Domain(DomainError),
GenerationFailed(String),
ValidationFailed(String),
}
impl fmt::Display for ReportError {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
match self {
ReportError::Domain(err) => write!(f, "{err}"),
ReportError::GenerationFailed(msg) => write!(f, "Report generation failed: {msg}"),
ReportError::ValidationFailed(msg) => write!(f, "Report validation failed: {msg}"),
}
}
}
impl std::error::Error for ReportError {}
impl From<DomainError> for ReportError {
fn from(err: DomainError) -> Self {
ReportError::Domain(err)
}
}
#[derive(Debug, Clone)]
pub enum PublishError {
Domain(DomainError),
NetworkFailed(String),
AuthenticationFailed(String),
SerializationFailed(String),
}
impl fmt::Display for PublishError {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
match self {
PublishError::Domain(err) => write!(f, "{err}"),
PublishError::NetworkFailed(msg) => write!(f, "Network operation failed: {msg}"),
PublishError::AuthenticationFailed(msg) => write!(f, "Authentication failed: {msg}"),
PublishError::SerializationFailed(msg) => write!(f, "Serialization failed: {msg}"),
}
}
}
impl std::error::Error for PublishError {}
impl From<DomainError> for PublishError {
fn from(err: DomainError) -> Self {
PublishError::Domain(err)
}
}
#[derive(Debug, Clone)]
pub enum SystemError {
CommandFailed {
command: String,
exit_code: Option<i32>,
stderr: String,
},
CommandNotFound(String),
PermissionDenied(String),
IoError(String),
IoErrorWithPath { path: String, message: String },
ParseError(String),
Timeout(String),
NotAvailable { resource: String },
}
impl fmt::Display for SystemError {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
match self {
SystemError::CommandFailed {
command,
exit_code,
stderr,
} => {
write!(f, "Command '{command}' failed")?;
if let Some(code) = exit_code {
write!(f, " with exit code {code}")?;
}
if !stderr.is_empty() {
write!(f, ": {stderr}")?;
}
Ok(())
}
SystemError::CommandNotFound(cmd) => write!(f, "Command not found: {cmd}"),
SystemError::PermissionDenied(msg) => write!(f, "Permission denied: {msg}"),
SystemError::IoError(msg) => write!(f, "I/O error: {msg}"),
SystemError::IoErrorWithPath { path, message } => {
write!(f, "I/O error at '{}': {}", path, message)
}
SystemError::ParseError(msg) => write!(f, "Parse error: {msg}"),
SystemError::Timeout(msg) => write!(f, "Timeout: {msg}"),
SystemError::NotAvailable { resource } => {
write!(f, "Resource not available: {}", resource)
}
}
}
}
impl std::error::Error for SystemError {}
impl From<SystemError> for DomainError {
fn from(err: SystemError) -> Self {
match err {
SystemError::CommandFailed { command, .. } => {
DomainError::HardwareCollectionFailed(format!("System command failed: {command}"))
}
SystemError::CommandNotFound(cmd) => DomainError::MissingDependencies(vec![cmd]),
SystemError::PermissionDenied(_) => {
DomainError::InsufficientPrivileges("System access denied".to_string())
}
SystemError::IoError(msg) => {
DomainError::SystemInfoUnavailable(format!("I/O error: {msg}"))
}
SystemError::IoErrorWithPath { path, message } => {
DomainError::SystemInfoUnavailable(format!("I/O error at '{}': {}", path, message))
}
SystemError::ParseError(msg) => DomainError::ParsingFailed(msg),
SystemError::Timeout(msg) => DomainError::Timeout(msg),
SystemError::NotAvailable { resource } => {
DomainError::SystemInfoUnavailable(format!("Resource not available: {}", resource))
}
}
}
}
#[derive(Debug, Clone)]
pub enum CommandError {
System(SystemError),
ExecutionFailed(String),
InvalidArguments(String),
}
impl fmt::Display for CommandError {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
match self {
CommandError::System(err) => write!(f, "{err}"),
CommandError::ExecutionFailed(msg) => write!(f, "Command execution failed: {msg}"),
CommandError::InvalidArguments(msg) => write!(f, "Invalid arguments: {msg}"),
}
}
}
impl std::error::Error for CommandError {}
impl From<SystemError> for CommandError {
fn from(err: SystemError) -> Self {
CommandError::System(err)
}
}
impl From<CommandError> for DomainError {
fn from(err: CommandError) -> Self {
match err {
CommandError::System(sys_err) => sys_err.into(),
CommandError::ExecutionFailed(msg) => {
DomainError::SystemInfoUnavailable(format!("Command execution failed: {msg}"))
}
CommandError::InvalidArguments(msg) => {
DomainError::InvalidConfiguration(format!("Invalid command arguments: {msg}"))
}
}
}
}