use std::error::Error;
use std::fmt::{Display, Formatter, Result as FResult};
use std::net::SocketAddr;
use std::path::PathBuf;
#[derive(Debug)]
pub enum StoreError {
ReaderParseError { err: serde_yaml::Error },
FileOpenError { path: PathBuf, err: std::io::Error },
FileParseError { path: PathBuf, err: serde_yaml::Error },
DirReadError { path: PathBuf, err: std::io::Error },
DirReadEntryError { path: PathBuf, i: usize, err: std::io::Error },
AssetInfoReadError { path: PathBuf, err: specifications::data::AssetInfoError },
}
impl Display for StoreError {
fn fmt(&self, f: &mut Formatter<'_>) -> FResult {
use StoreError::*;
match self {
ReaderParseError { .. } => write!(f, "Failed to parse the given store reader as YAML"),
FileOpenError { path, .. } => write!(f, "Failed to open store file '{}'", path.display()),
FileParseError { path, .. } => write!(f, "Failed to parse store file '{}' as YAML", path.display()),
DirReadError { path, .. } => write!(f, "Failed to read directory '{}'", path.display()),
DirReadEntryError { path, i, .. } => write!(f, "Failed to read entry {} in directory '{}'", i, path.display()),
AssetInfoReadError { path, .. } => write!(f, "Failed to load asset info file '{}'", path.display()),
}
}
}
impl Error for StoreError {
fn source(&self) -> Option<&(dyn Error + 'static)> {
use StoreError::*;
match self {
ReaderParseError { err } => Some(err),
FileOpenError { err, .. } => Some(err),
FileParseError { err, .. } => Some(err),
DirReadError { err, .. } => Some(err),
DirReadEntryError { err, .. } => Some(err),
AssetInfoReadError { err, .. } => Some(err),
}
}
}
#[derive(Debug)]
pub enum ServerError {
ServerBindError { address: SocketAddr, err: std::io::Error },
KeypairLoadError { err: brane_cfg::certs::Error },
StoreLoadError { err: brane_cfg::certs::Error },
ServerConfigError { err: rustls::Error },
}
impl Display for ServerError {
fn fmt(&self, f: &mut Formatter<'_>) -> FResult {
use ServerError::*;
match self {
ServerBindError { address, .. } => write!(f, "Failed to bind new TCP server to '{address}'"),
KeypairLoadError { .. } => write!(f, "Failed to load keypair"),
StoreLoadError { .. } => write!(f, "Failed to load root store"),
ServerConfigError { .. } => write!(f, "Failed to create new TLS server configuration"),
}
}
}
impl Error for ServerError {
fn source(&self) -> Option<&(dyn Error + 'static)> {
use ServerError::*;
match self {
ServerBindError { err, .. } => Some(err),
KeypairLoadError { err } => Some(err),
StoreLoadError { err } => Some(err),
ServerConfigError { err } => Some(err),
}
}
}
#[derive(Debug)]
pub enum DataError {
StoreSerializeError { err: serde_json::Error },
AssetSerializeError { name: String, err: serde_json::Error },
TempDirCreateError { err: std::io::Error },
DataArchiveError { err: brane_shr::fs::Error },
TarOpenError { path: PathBuf, err: std::io::Error },
TarReadError { path: PathBuf, err: std::io::Error },
TarSendError { err: warp::hyper::Error },
UnknownFileTypeError { path: PathBuf },
MissingData { name: String, path: PathBuf },
MissingResult { name: String, path: PathBuf },
}
impl Display for DataError {
fn fmt(&self, f: &mut Formatter<'_>) -> FResult {
use DataError::*;
match self {
StoreSerializeError { .. } => write!(f, "Failed to serialize known datasets"),
AssetSerializeError { name, .. } => write!(f, "Failed to serialize dataset metadata for dataset '{name}'"),
TempDirCreateError { .. } => write!(f, "Failed to create a temporary directory"),
DataArchiveError { .. } => write!(f, "Failed to archive data"),
TarOpenError { path, .. } => write!(f, "Failed to re-open tarball file '{}'", path.display()),
TarReadError { path, .. } => write!(f, "Failed to read from tarball file '{}'", path.display()),
TarSendError { .. } => write!(f, "Failed to send chunk of tarball file as body"),
UnknownFileTypeError { path } => {
write!(f, "Dataset file '{}' is neither a file, nor a directory; don't know what to do with it", path.display())
},
MissingData { name, path } => write!(f, "The data of dataset '{}' should be at '{}', but doesn't exist", name, path.display()),
MissingResult { name, path } => {
write!(f, "The data of intermediate result '{}' should be at '{}', but doesn't exist", name, path.display())
},
}
}
}
impl Error for DataError {
fn source(&self) -> Option<&(dyn Error + 'static)> {
use DataError::*;
match self {
StoreSerializeError { err } => Some(err),
AssetSerializeError { err, .. } => Some(err),
TempDirCreateError { err } => Some(err),
DataArchiveError { err } => Some(err),
TarOpenError { err, .. } => Some(err),
TarReadError { err, .. } => Some(err),
TarSendError { err, .. } => Some(err),
UnknownFileTypeError { .. } => None,
MissingData { .. } => None,
MissingResult { .. } => None,
}
}
}
impl warp::reject::Reject for DataError {}
#[derive(Debug)]
pub enum AuthorizeError {
ClientNoCert,
PolicyFileError { err: brane_cfg::policies::Error },
NoUserPolicy { user: String, data: String },
}
impl Display for AuthorizeError {
fn fmt(&self, f: &mut Formatter<'_>) -> FResult {
use AuthorizeError::*;
match self {
ClientNoCert => write!(f, "No certificate provided"),
PolicyFileError { .. } => write!(f, "Failed to load policy file"),
NoUserPolicy { user, data } => {
write!(f, "No matching policy rule found for user '{user}' / data '{data}' (did you forget a final AllowAll/DenyAll?)")
},
}
}
}
impl Error for AuthorizeError {
fn source(&self) -> Option<&(dyn Error + 'static)> {
use AuthorizeError::*;
match self {
ClientNoCert => None,
PolicyFileError { err } => Some(err),
NoUserPolicy { .. } => None,
}
}
}