use std::{error::Error, fmt, io};
use snafu::{Backtrace, prelude::*};
#[derive(Debug)]
pub enum BackendError {
Local(io::Error),
}
impl fmt::Display for BackendError {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
match self {
BackendError::Local(e) => write!(f, "local I/O error: {e}"),
}
}
}
impl Error for BackendError {
fn source(&self) -> Option<&(dyn Error + 'static)> {
match self {
BackendError::Local(e) => Some(e),
}
}
}
#[derive(Debug, Snafu)]
#[snafu(visibility(pub(crate)))]
pub enum StorageError {
#[snafu(display("Path not found: {path}"))]
NotFound {
path: String,
source: BackendError,
backtrace: Backtrace,
},
#[snafu(display("Path already exists: {path}"))]
AlreadyExists {
path: String,
source: BackendError,
backtrace: Backtrace,
},
#[snafu(display("Local I/O error at {path}: {source}"))]
OtherIo {
path: String,
source: BackendError,
backtrace: Backtrace,
},
#[snafu(display("Path already exists: {path}"))]
AlreadyExistsNoSource {
path: String,
backtrace: Backtrace,
},
}