use thiserror::Error;
use crate::backend::Backend;
#[derive(Debug, Clone)]
pub struct BackendFailure {
pub backend: Backend,
pub message: String,
}
impl std::fmt::Display for BackendFailure {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
write!(f, "{}: {}", self.backend, self.message)
}
}
fn format_failures(failures: &[BackendFailure]) -> String {
failures
.iter()
.map(|f| format!(" - {}", f))
.collect::<Vec<_>>()
.join("\n")
}
#[derive(Debug, Error)]
pub enum UnifiedError {
#[error("all configured backends failed to initialize:\n{details}", details = format_failures(failures))]
AllBackendsFailed { failures: Vec<BackendFailure> },
#[error("config contains no backends")]
EmptyBackendOrder,
#[error("could not detect the video codec of the input data")]
CodecNotDetected,
#[error("{message}")]
Unsupported { message: String },
#[error("backend error: {source}")]
Backend { source: Box<dyn std::error::Error + Send + Sync> },
#[error("image processing error: {message}")]
ImageProcessing { message: String },
}
impl UnifiedError {
pub fn failures(&self) -> Option<&[BackendFailure]> {
match self {
Self::AllBackendsFailed { failures } => Some(failures),
_ => None,
}
}
}
pub type UnifiedResult<T> = std::result::Result<T, UnifiedError>;