use thiserror::Error;
#[derive(Error, Debug)]
pub enum ViewerError {
#[error("html_view_app binary not found: {0}")]
BinaryNotFound(String),
#[error("failed to spawn html_view_app: {0}")]
SpawnFailed(String),
#[error("failed to write configuration file: {0}")]
ConfigWriteFailed(String),
#[error("failed to read result file: {0}")]
ResultReadFailed(String),
#[error("invalid response from viewer: {0}")]
InvalidResponse(String),
#[error("viewer timed out")]
Timeout,
#[error("version mismatch: library v{library}, viewer v{viewer}\n{suggestion}")]
VersionMismatch {
library: String,
viewer: String,
suggestion: String,
},
#[error("I/O error: {0}")]
IoError(#[from] std::io::Error),
#[error("serialization error: {0}")]
SerdeError(String),
#[error("command timed out after {timeout_secs}s (seq: {seq})")]
CommandTimeout { seq: u64, timeout_secs: u64 },
#[error("command failed: {0}")]
CommandFailed(String),
#[error("refresh not supported: {0}")]
RefreshNotSupported(String),
}
impl Clone for ViewerError {
fn clone(&self) -> Self {
match self {
ViewerError::BinaryNotFound(err) => ViewerError::BinaryNotFound(err.clone()),
ViewerError::SpawnFailed(err) => ViewerError::SpawnFailed(err.clone()),
ViewerError::ConfigWriteFailed(err) => ViewerError::ConfigWriteFailed(err.clone()),
ViewerError::ResultReadFailed(err) => ViewerError::ResultReadFailed(err.clone()),
ViewerError::InvalidResponse(err) => ViewerError::InvalidResponse(err.clone()),
ViewerError::Timeout => ViewerError::Timeout,
ViewerError::VersionMismatch {
library,
viewer,
suggestion,
} => ViewerError::VersionMismatch {
library: library.clone(),
viewer: viewer.clone(),
suggestion: suggestion.clone(),
},
ViewerError::IoError(err) => {
ViewerError::IoError(std::io::Error::new(err.kind(), err.to_string()))
}
ViewerError::SerdeError(err) => ViewerError::SerdeError(err.to_string()),
ViewerError::CommandTimeout { seq, timeout_secs } => ViewerError::CommandTimeout {
seq: *seq,
timeout_secs: *timeout_secs,
},
ViewerError::CommandFailed(err) => ViewerError::CommandFailed(err.clone()),
ViewerError::RefreshNotSupported(err) => ViewerError::RefreshNotSupported(err.clone()),
}
}
}