1use std::fmt;
2
3#[derive(Clone, Debug, PartialEq, Eq)]
5#[non_exhaustive]
6pub enum EngineError {
7 Evaluate(alpha2_eval::EvalError),
9 Render(alpha2_render::RenderError),
11 InvalidQualityProfile,
13 OutOfRange,
15 EmptyExportRange,
17 ExportTooLarge {
19 frames: u64,
21 maximum: u64,
23 },
24 Text(crate::TextError),
26 InvalidAudioConfiguration,
28 InvalidNormalizationGain,
31 UnregisteredEffect {
34 effect: String,
36 version: u32,
38 },
39 ExportProjectChanged,
42 OddExportDimensions {
48 width: u32,
50 height: u32,
52 suggested: (u32, u32),
55 },
56}
57
58impl fmt::Display for EngineError {
59 fn fmt(&self, formatter: &mut fmt::Formatter<'_>) -> fmt::Result {
60 match self {
61 Self::Evaluate(error) => write!(formatter, "timeline evaluation failed: {error}"),
62 Self::Render(error) => write!(formatter, "rendering failed: {error}"),
63 Self::InvalidQualityProfile => formatter.write_str("quality profile is invalid"),
64 Self::OutOfRange => formatter.write_str("timeline or output size is out of range"),
65 Self::EmptyExportRange => formatter.write_str("export range must not be empty"),
66 Self::ExportTooLarge { frames, maximum } => write!(
67 formatter,
68 "export requests {frames} frames; the maximum is {maximum}"
69 ),
70 Self::Text(error) => write!(formatter, "{error}"),
71 Self::InvalidAudioConfiguration => {
72 formatter.write_str("audio channel layout, sample rate, or block size is invalid")
73 }
74 Self::InvalidNormalizationGain => formatter.write_str(
75 "loudness normalization gain is not finite or past what a 32-bit float factor holds",
76 ),
77 Self::UnregisteredEffect { effect, version } => write!(
78 formatter,
79 "the project draws effect {effect}@{version}, which is not registered"
80 ),
81 Self::ExportProjectChanged => formatter.write_str(
82 "an export step was given another project than the export was started with",
83 ),
84 Self::OddExportDimensions {
85 width,
86 height,
87 suggested: (suggested_width, suggested_height),
88 } => write!(
89 formatter,
90 "4:2:0 video export must have even dimensions, but the output is \
91 {width}x{height}; the nearest even size is {suggested_width}x{suggested_height}"
92 ),
93 }
94 }
95}
96
97impl std::error::Error for EngineError {
98 fn source(&self) -> Option<&(dyn std::error::Error + 'static)> {
99 match self {
100 Self::Evaluate(error) => Some(error),
101 Self::Render(error) => Some(error),
102 _ => None,
103 }
104 }
105}
106
107impl From<alpha2_eval::EvalError> for EngineError {
108 fn from(error: alpha2_eval::EvalError) -> Self {
109 Self::Evaluate(error)
110 }
111}
112
113impl From<alpha2_render::RenderError> for EngineError {
114 fn from(error: alpha2_render::RenderError) -> Self {
115 Self::Render(error)
116 }
117}