use anyhow::anyhow;
use hconf::config::ConfigError;
use mkutil::Report;
#[derive(Debug, failure::Fail, Clone)]
pub enum DatabaseError {
#[fail(display = "{}", _0)]
ConfigError(String),
#[cfg(feature = "mongo")]
#[fail(display = "Failed to parse connection URI: {}", _0)]
MongoInvalidClientOptions(String),
#[cfg(feature = "mongo")]
#[fail(display = "No handle to MongoDB client")]
MongoClientNotFound,
#[cfg(feature = "mongo")]
#[fail(display = "{}", _0)]
MongoClientError(String),
#[fail(display = "No Bson Document found given filter: {}", _0)]
BsonNoResult(String),
#[fail(display = "{}", _0)]
BsonValueAccessError(String),
#[fail(display = "No Bson Document found")]
BsonDocumentNotFound,
#[fail(display = "Deserialization failed: {}", _0)]
BsonDeserializationError(String),
#[cfg(feature = "kitsu")]
#[fail(display = "No handle to Zou client")]
ZouClientNotFound,
#[cfg(any(feature = "shotgrid", feature = "shotgrid_async_test"))]
#[fail(display = "Failed to create ShotGrid client: {}", _0)]
ShotGridClientError(String),
#[cfg(any(feature = "shotgrid", feature = "shotgrid_async_test"))]
#[fail(display = "Failed to authenticate ShotGrid: {}", _0)]
ShotGridAuthenticationError(String),
#[fail(display = "HTTP/WS Request failed: {}", _0)]
ReqwestError(String),
#[fail(display = "Failed to get the tokio runtime handle")]
NoRuntimeHandle,
#[fail(display = "Uninitialized data")]
Uninitialized,
#[fail(display = "Unimplemented function")]
Unimplemented,
#[fail(display = "{}", _0)]
Anyhow(String),
}
impl From<&ConfigError> for DatabaseError {
fn from(error: &ConfigError) -> Self {
DatabaseError::ConfigError(format!("{}", error))
}
}
#[cfg(feature = "mongo")]
impl From<mongodb::error::Error> for DatabaseError {
fn from(error: mongodb::error::Error) -> Self {
DatabaseError::MongoClientError(format!("{}", error))
}
}
impl From<bson::document::ValueAccessError> for DatabaseError {
fn from(error: bson::document::ValueAccessError) -> Self {
DatabaseError::BsonValueAccessError(format!("{}", error))
}
}
impl From<bson::de::Error> for DatabaseError {
fn from(error: bson::de::Error) -> Self {
DatabaseError::BsonDeserializationError(format!("{}", error))
}
}
impl From<reqwest::Error> for DatabaseError {
fn from(error: reqwest::Error) -> Self {
DatabaseError::ReqwestError(format!("{}", error))
}
}
impl From<anyhow::Error> for DatabaseError {
fn from(error: anyhow::Error) -> Self {
DatabaseError::Anyhow(format!("{}", error))
}
}
impl Into<anyhow::Error> for DatabaseError {
fn into(self) -> anyhow::Error {
anyhow!("{}", self)
}
}
#[derive(Debug, failure::Fail)]
pub enum ModificationError {
#[fail(display = "No interaction CtxRef given")]
NoInteractionContext,
#[fail(display = "No active project")]
NoActiveProject,
#[fail(display = "No active asset")]
NoActiveAsset,
#[fail(display = "Given bson is not document")]
BsonIsNotDocument,
#[fail(display = "Received unexpected bson type")]
UnexpectedBsonEnum,
#[fail(display = "{}", _0)]
DatabaseError(String),
#[fail(display = "{}", _0)]
SerializationError(String),
#[fail(display = "{}", _0)]
Anyhow(String),
}
impl From<DatabaseError> for ModificationError {
fn from(error: DatabaseError) -> Self {
ModificationError::DatabaseError(format!("{}", error))
}
}
#[cfg(feature = "mongo")]
impl From<mongodb::error::Error> for ModificationError {
fn from(error: mongodb::error::Error) -> Self {
DatabaseError::MongoClientError(format!("{}", error)).into()
}
}
impl From<bson::ser::Error> for ModificationError {
fn from(error: bson::ser::Error) -> Self {
ModificationError::SerializationError(format!("{}", error))
}
}
impl From<anyhow::Error> for ModificationError {
fn from(error: anyhow::Error) -> Self {
ModificationError::Anyhow(format!("{}", error))
}
}
impl From<bson::document::ValueAccessError> for ModificationError {
fn from(error: bson::document::ValueAccessError) -> Self {
DatabaseError::BsonValueAccessError(format!("{}", error)).into()
}
}
impl Into<anyhow::Error> for ModificationError {
fn into(self) -> anyhow::Error {
anyhow!("{}", self)
}
}
impl Into<Report> for ModificationError {
fn into(self) -> Report {
Report::into_new("Modification Error", self.to_string())
}
}