use crate::{
AskError, CacheError, EnvError, InvalidAnswer, InvalidBbox, InvalidChoice, InvalidImage,
InvalidNoul, InvalidScore, QuestionError,
};
use std::fmt;
#[derive(thiserror::Error)]
#[non_exhaustive]
pub enum Error {
#[error(transparent)]
Question(#[from] QuestionError),
#[error(transparent)]
Answer(#[from] InvalidAnswer),
#[error(transparent)]
Image(#[from] InvalidImage),
#[error(transparent)]
Ask(#[from] AskError),
#[error(transparent)]
Cache(#[from] CacheError),
#[error(transparent)]
Env(#[from] EnvError),
}
impl fmt::Debug for Error {
fn fmt(&self, formatter: &mut fmt::Formatter<'_>) -> fmt::Result {
write!(formatter, "{self}")?;
let mut source = std::error::Error::source(self);
if source.is_some() {
write!(formatter, "\n\nCaused by:")?;
}
while let Some(cause) = source {
write!(formatter, "\n {cause}")?;
source = cause.source();
}
Ok(())
}
}
impl From<InvalidNoul> for Error {
fn from(error: InvalidNoul) -> Self {
Error::Question(QuestionError::Noul(error))
}
}
impl From<InvalidChoice> for Error {
fn from(error: InvalidChoice) -> Self {
Error::Question(QuestionError::Choice(error))
}
}
impl From<InvalidScore> for Error {
fn from(error: InvalidScore) -> Self {
Error::Question(QuestionError::Score(error))
}
}
impl From<InvalidBbox> for Error {
fn from(error: InvalidBbox) -> Self {
Error::Question(QuestionError::Bbox(error))
}
}
pub type Result<T, E = Error> = std::result::Result<T, E>;