use std::path::{Path, PathBuf};
use thiserror::Error;
pub type Result<T> = std::result::Result<T, MiniSnapError>;
#[derive(Error, Debug)]
pub enum MiniSnapError {
#[error("I/O error on {path}: {source}")]
Io { source: std::io::Error, path: PathBuf },
#[error("Codec error: {source}")]
Codec { source: Box<dyn std::error::Error + Send + Sync + 'static> },
#[error("Snapshot not found")]
NotFound,
#[error("Tokio error")]
TokioError {
#[from]
source: tokio::task::JoinError,
},
}
impl MiniSnapError {
pub fn io(err: std::io::Error, path: impl AsRef<Path>) -> Self {
Self::Io {
source: err,
path: path.as_ref().into(),
}
}
}
impl From<std::io::Error> for MiniSnapError {
fn from(err: std::io::Error) -> Self {
Self::io(err, PathBuf::from("<unknown>"))
}
}
impl From<tempfile::PersistError> for MiniSnapError {
fn from(err: tempfile::PersistError) -> Self {
let path = err.file.path().to_path_buf();
Self::io(err.into(), path)
}
}