use thiserror::Error;
use crate::api::{Exception, JsonErrorBody, MaybeUnknown, XmlErrorBody};
#[derive(Debug, Error)]
pub enum Error {
#[error("{0}")]
HttpError(#[from] reqwest::Error),
#[error("invalid url")]
UrlError(#[from] url::ParseError),
#[error("jotta error")]
JottaError(ApiResError),
#[error("xml error: {0}")]
XmlError(#[from] serde_xml_rs::Error),
#[error("file or folder already exists")]
AlreadyExists,
#[error("bad credentials")]
BadCredentials,
#[error("file or folder does not exist")]
NoSuchFileOrFolder,
#[error("incomplete upload; maybe too short body?")]
IncompleteUpload,
#[error("invalid argument")]
InvalidArgument,
#[error("corrupt upload")]
CorruptUpload,
#[error("token renewal failed")]
TokenRenewalFailed,
#[error("range not satisfiable")]
RangeNotSatisfiable,
}
#[derive(Debug)]
pub enum ApiResError {
Json(JsonErrorBody),
Xml(XmlErrorBody),
}
impl From<JsonErrorBody> for Error {
fn from(err: JsonErrorBody) -> Self {
match err.error_id {
Some(MaybeUnknown::Known(exception)) => Error::from(exception),
_ => Self::JottaError(ApiResError::Json(err)),
}
}
}
impl From<XmlErrorBody> for Error {
fn from(err: XmlErrorBody) -> Self {
if let Some(exception) = err.exception_opt() {
Error::from(exception)
} else {
Self::JottaError(ApiResError::Xml(err))
}
}
}
impl From<Exception> for Error {
fn from(exception: Exception) -> Self {
match exception {
Exception::UniqueFileException => Error::AlreadyExists,
Exception::BadCredentialsException => Error::BadCredentials,
Exception::CorruptUploadOpenApiException => Error::CorruptUpload,
Exception::NoSuchFileException | Exception::NoSuchPathException => {
Error::NoSuchFileOrFolder
}
Exception::InvalidArgumentException => Error::InvalidArgument,
Exception::IncompleteUploadOpenApiException => Error::IncompleteUpload,
Exception::RequestedRangeNotSatisfiedException => Error::RangeNotSatisfiable,
}
}
}