use std::fmt;
#[derive(Clone, Debug, PartialEq, Eq)]
#[non_exhaustive]
pub enum EngineError {
Evaluate(alpha2_eval::EvalError),
Render(alpha2_render::RenderError),
InvalidQualityProfile,
OutOfRange,
EmptyExportRange,
ExportTooLarge {
frames: u64,
maximum: u64,
},
Text(crate::TextError),
InvalidAudioConfiguration,
InvalidNormalizationGain,
UnregisteredEffect {
effect: String,
version: u32,
},
ExportProjectChanged,
OddExportDimensions {
width: u32,
height: u32,
suggested: (u32, u32),
},
}
impl fmt::Display for EngineError {
fn fmt(&self, formatter: &mut fmt::Formatter<'_>) -> fmt::Result {
match self {
Self::Evaluate(error) => write!(formatter, "timeline evaluation failed: {error}"),
Self::Render(error) => write!(formatter, "rendering failed: {error}"),
Self::InvalidQualityProfile => formatter.write_str("quality profile is invalid"),
Self::OutOfRange => formatter.write_str("timeline or output size is out of range"),
Self::EmptyExportRange => formatter.write_str("export range must not be empty"),
Self::ExportTooLarge { frames, maximum } => write!(
formatter,
"export requests {frames} frames; the maximum is {maximum}"
),
Self::Text(error) => write!(formatter, "{error}"),
Self::InvalidAudioConfiguration => {
formatter.write_str("audio channel layout, sample rate, or block size is invalid")
}
Self::InvalidNormalizationGain => formatter.write_str(
"loudness normalization gain is not finite or past what a 32-bit float factor holds",
),
Self::UnregisteredEffect { effect, version } => write!(
formatter,
"the project draws effect {effect}@{version}, which is not registered"
),
Self::ExportProjectChanged => formatter.write_str(
"an export step was given another project than the export was started with",
),
Self::OddExportDimensions {
width,
height,
suggested: (suggested_width, suggested_height),
} => write!(
formatter,
"4:2:0 video export must have even dimensions, but the output is \
{width}x{height}; the nearest even size is {suggested_width}x{suggested_height}"
),
}
}
}
impl std::error::Error for EngineError {
fn source(&self) -> Option<&(dyn std::error::Error + 'static)> {
match self {
Self::Evaluate(error) => Some(error),
Self::Render(error) => Some(error),
_ => None,
}
}
}
impl From<alpha2_eval::EvalError> for EngineError {
fn from(error: alpha2_eval::EvalError) -> Self {
Self::Evaluate(error)
}
}
impl From<alpha2_render::RenderError> for EngineError {
fn from(error: alpha2_render::RenderError) -> Self {
Self::Render(error)
}
}