use arcbox_error::CommonError;
use thiserror::Error;
pub type Result<T> = std::result::Result<T, SnapshotError>;
#[derive(Debug, Error)]
pub enum SnapshotError {
#[error(transparent)]
Common(#[from] CommonError),
#[error("snapshot error: {0}")]
Snapshot(String),
#[error("device-mapper error: {0}")]
DeviceMapper(String),
#[error("template not found: {0}")]
TemplateNotFound(String),
#[error("template version already exists: {0}")]
TemplateVersionExists(String),
#[error("failed precondition: {0}")]
FailedPrecondition(String),
#[error("service unavailable: {0}")]
Unavailable(String),
}
impl SnapshotError {
#[must_use]
pub fn config(msg: impl Into<String>) -> Self {
Self::Common(CommonError::config(msg))
}
#[must_use]
pub fn not_found(resource: impl Into<String>) -> Self {
Self::Common(CommonError::not_found(resource))
}
}
impl From<std::io::Error> for SnapshotError {
fn from(err: std::io::Error) -> Self {
Self::Common(CommonError::Io(err))
}
}
impl From<serde_json::Error> for SnapshotError {
fn from(err: serde_json::Error) -> Self {
Self::Snapshot(format!("JSON error: {err}"))
}
}
impl From<arcbox_atomic_file::AtomicWriteError> for SnapshotError {
fn from(err: arcbox_atomic_file::AtomicWriteError) -> Self {
use arcbox_atomic_file::AtomicWriteError;
match err {
AtomicWriteError::NotCommitted { source, .. } => Self::Common(CommonError::Io(source)),
error @ AtomicWriteError::DurabilityUncertain { .. } => {
Self::Unavailable(error.to_string())
}
}
}
}