diff --git a/src/lib.rs b/src/lib.rs index 10bf81d59ad9382283742cfe1d4f9b0aa6463b6f..d689aea47d2bc93ad4c56b5036d40789dbe1407b 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -23,6 +23,12 @@ macro_rules! warn_debug { }; } +macro_rules! warn_err { + ($msg:literal, $($arg:expr),*) => { + rustmex::warning("serialbridge:error", format!($msg, $($arg),*)); + }; +} + /// in release mode, this macro does nothing #[cfg(not(debug_assertions))] macro_rules! warn_debug { @@ -65,23 +71,31 @@ impl Output<'_> { /// The entrypoint of the MEX function #[rustmex::entrypoint] fn serialbridge(lhs: Lhs, rhs: Rhs) -> rustmex::Result<()> { - // Create wrappers for the input and output arguments - let args = Args(rhs); - let out = Output(lhs); - - // Get the mode argument ("Open", "Close", "Read", "Write") - let mode = get_mode(args.get(0, Error::MissingSerialMode)?)?; - - warn_debug!("Mode: {:?}", mode); - - // Dispatch to the appropriate function - match mode { - Mode::Open => open_serial(args)?, - Mode::Close => close_serial(args)?, - Mode::CloseAll => close_all_serials(args)?, - Mode::Read => read_from_serial(out, args)?, - Mode::Write => write_to_serial(args)?, - Mode::ClearBuffer => clear_buffer(args)?, + fn inner(lhs: Lhs, rhs: Rhs) -> rustmex::Result<()> { + // Create wrappers for the input and output arguments + let args = Args(rhs); + let out = Output(lhs); + + // Get the mode argument ("Open", "Close", "Read", "Write") + let mode = get_mode(args.get(0, Error::MissingSerialMode)?)?; + + warn_debug!("Mode: {:?}", mode); + + // Dispatch to the appropriate function + match mode { + Mode::Open => open_serial(args)?, + Mode::Close => close_serial(args)?, + Mode::CloseAll => close_all_serials(args)?, + Mode::Read => read_from_serial(out, args)?, + Mode::Write => write_to_serial(args)?, + Mode::ClearBuffer => clear_buffer(args)?, + } + + Ok(()) + } + + if let Err(e) = inner(lhs, rhs) { + warn_err!("Error: {}", e.to_string()); } Ok(())