@@ -5,21 +5,41 @@ use crate::{
55 format:: VideoFormat ,
66 frame:: { Frame , FrameContext } ,
77 log:: { log_handler_callback, LogHandle , LogHandler , MessageType } ,
8- map:: Map ,
8+ map:: { Map , MapError } ,
9+ node:: Node ,
910 plugin:: Plugin ,
1011} ;
1112use bitflags:: bitflags;
12- use core:: fmt;
1313use rustsynth_sys as ffi;
14+ use std:: fmt;
1415use std:: {
15- ffi:: { CStr , CString } ,
16+ ffi:: { CStr , CString , NulError } ,
1617 marker:: PhantomData ,
1718 ptr:: NonNull ,
1819} ;
20+ use thiserror:: Error ;
1921
2022#[ cfg( test) ]
2123mod tests;
2224
25+ /// The error type for `Core` operations.
26+ #[ derive( Error , Debug ) ]
27+ pub enum CoreError {
28+ #[ error( "Failed to create map: {0}" ) ]
29+ MapCreationFailed ( #[ from] MapError ) ,
30+ #[ error( "Invalid filter name: {0}" ) ]
31+ InvalidFilterName ( #[ from] NulError ) ,
32+ #[ error( "Failed to create video filter" ) ]
33+ VideoFilterCreationFailed ,
34+ #[ error( "Failed to create audio filter" ) ]
35+ AudioFilterCreationFailed ,
36+ #[ error( "{0}" ) ]
37+ Custom ( String ) ,
38+ }
39+
40+ /// A specialized `Result` type for `Core` operations.
41+ pub type CoreResult < T > = Result < T , CoreError > ;
42+
2343bitflags ! {
2444 /// Options when creating a core.
2545 pub struct CoreCreationFlags : u32 {
@@ -208,13 +228,13 @@ impl<'core> CoreRef<'core> {
208228 }
209229
210230 /// Create a video filter using the Filter trait
211- pub fn create_video_filter < F > ( & self , filter : & F ) -> Result < Map < ' _ > , String >
231+ pub fn create_video_filter < F > ( & self , filter : & F ) -> CoreResult < Map < ' _ > >
212232 where
213233 F : Filter < ' core > ,
214234 {
215- let out = Map :: new ( ) ;
235+ let out = Map :: new ( ) ? ;
216236 // Get video info from the filter
217- let video_info = filter. get_video_info ( ) ?;
237+ let video_info = filter. get_video_info ( ) . map_err ( CoreError :: Custom ) ?;
218238 let dependencies = filter. get_dependencies ( ) ;
219239
220240 // Convert dependencies to FFI format
@@ -226,7 +246,7 @@ impl<'core> CoreRef<'core> {
226246 let instance_data = Box :: into_raw ( filter_box) as * mut std:: ffi:: c_void ;
227247
228248 // Create C strings for name
229- let name_cstr = CString :: new ( F :: NAME ) . map_err ( |_| "Invalid filter name" ) ?;
249+ let name_cstr = CString :: new ( F :: NAME ) ?;
230250
231251 unsafe {
232252 API :: get_cached ( ) . create_video_filter (
@@ -247,12 +267,12 @@ impl<'core> CoreRef<'core> {
247267 }
248268
249269 /// Create a video filter using the Filter trait (returns node directly)
250- pub fn create_video_filter2 < F > ( & self , filter : & F ) -> Result < crate :: node:: Node < ' core > , String >
270+ pub fn create_video_filter2 < F > ( & self , filter : & F ) -> CoreResult < crate :: node:: Node < ' core > >
251271 where
252272 F : Filter < ' core > ,
253273 {
254274 // Get video info from the filter
255- let video_info = filter. get_video_info ( ) ?;
275+ let video_info = filter. get_video_info ( ) . map_err ( CoreError :: Custom ) ?;
256276 let dependencies = filter. get_dependencies ( ) ;
257277
258278 // Convert dependencies to FFI format
@@ -264,7 +284,7 @@ impl<'core> CoreRef<'core> {
264284 let instance_data = Box :: into_raw ( filter_box) as * mut std:: ffi:: c_void ;
265285
266286 // Create C strings for name
267- let name_cstr = CString :: new ( F :: NAME ) . map_err ( |_| "Invalid filter name" ) ?;
287+ let name_cstr = CString :: new ( F :: NAME ) ?;
268288
269289 let node_ptr = unsafe {
270290 API :: get_cached ( ) . create_video_filter2 (
@@ -281,20 +301,20 @@ impl<'core> CoreRef<'core> {
281301 } ;
282302
283303 if node_ptr. is_null ( ) {
284- return Err ( "Failed to create video filter" . to_string ( ) ) ;
304+ return Err ( CoreError :: VideoFilterCreationFailed ) ;
285305 }
286306
287307 Ok ( unsafe { crate :: node:: Node :: from_ptr ( node_ptr) } )
288308 }
289309
290310 /// Create a audio filter using the Filter trait
291- pub fn create_audio_filter < F > ( & self , filter : & F ) -> Result < Map < ' _ > , String >
311+ pub fn create_audio_filter < F > ( & self , filter : & F ) -> CoreResult < Map < ' _ > >
292312 where
293313 F : Filter < ' core > ,
294314 {
295- let out = Map :: new ( ) ;
315+ let out = Map :: new ( ) ? ;
296316 // Get audio info from the filter
297- let audio_info = filter. get_audio_info ( ) ?;
317+ let audio_info = filter. get_audio_info ( ) . map_err ( CoreError :: Custom ) ?;
298318 let dependencies = filter. get_dependencies ( ) ;
299319
300320 // Convert dependencies to FFI format
@@ -306,7 +326,7 @@ impl<'core> CoreRef<'core> {
306326 let instance_data = Box :: into_raw ( filter_box) as * mut std:: ffi:: c_void ;
307327
308328 // Create C strings for name
309- let name_cstr = CString :: new ( F :: NAME ) . map_err ( |_| "Invalid filter name" ) ?;
329+ let name_cstr = CString :: new ( F :: NAME ) ?;
310330
311331 unsafe {
312332 API :: get_cached ( ) . create_audio_filter (
@@ -327,12 +347,12 @@ impl<'core> CoreRef<'core> {
327347 }
328348
329349 /// Create an audio filter using the Filter trait (returns node directly)
330- pub fn create_audio_filter2 < F > ( & self , filter : & F ) -> Result < crate :: node :: Node < ' core > , String >
350+ pub fn create_audio_filter2 < F > ( & self , filter : & F ) -> CoreResult < Node < ' core > >
331351 where
332352 F : Filter < ' core > ,
333353 {
334354 // Get audio info from the filter
335- let audio_info = filter. get_audio_info ( ) ?;
355+ let audio_info = filter. get_audio_info ( ) . map_err ( CoreError :: Custom ) ?;
336356 let dependencies = filter. get_dependencies ( ) ;
337357
338358 // Convert dependencies to FFI format
@@ -344,7 +364,7 @@ impl<'core> CoreRef<'core> {
344364 let instance_data = Box :: into_raw ( filter_box) as * mut std:: ffi:: c_void ;
345365
346366 // Create C strings for name
347- let name_cstr = CString :: new ( F :: NAME ) . map_err ( |_| "Invalid filter name" ) ?;
367+ let name_cstr = CString :: new ( F :: NAME ) ?;
348368
349369 let node_ptr = unsafe {
350370 API :: get_cached ( ) . create_audio_filter2 (
@@ -361,7 +381,7 @@ impl<'core> CoreRef<'core> {
361381 } ;
362382
363383 if node_ptr. is_null ( ) {
364- return Err ( "Failed to create audio filter" . to_string ( ) ) ;
384+ return Err ( CoreError :: AudioFilterCreationFailed ) ;
365385 }
366386
367387 Ok ( unsafe { crate :: node:: Node :: from_ptr ( node_ptr) } )
0 commit comments