From 8299746911367a7b966ee0e71f3a74e56279cc97 Mon Sep 17 00:00:00 2001
From: Federico Lolli <federico.lolli@skywarder.eu>
Date: Mon, 19 Feb 2024 00:24:28 +0100
Subject: [PATCH] added function dispatch

---
 src/error.rs |  2 +-
 src/lib.rs   | 31 ++++++++++++++++++++++---------
 2 files changed, 23 insertions(+), 10 deletions(-)

diff --git a/src/error.rs b/src/error.rs
index 29a57c7..c88808e 100644
--- a/src/error.rs
+++ b/src/error.rs
@@ -35,7 +35,7 @@ pub enum Error {
     MissingBaudrate,
     #[error("String contains invalid characters")]
     String(#[from] std::ffi::IntoStringError),
-    #[error("Invalid serial mode")]
+    #[error("Invalid serial mode (choose from 'Open', 'Close', 'Read', 'Write')")]
     InvalidMode,
     #[error("{0}")]
     Rustmex(#[from] rustmex::Error),
diff --git a/src/lib.rs b/src/lib.rs
index 9badc03..de878c3 100644
--- a/src/lib.rs
+++ b/src/lib.rs
@@ -1,31 +1,44 @@
-//! WARNING: panic is used as stated in the example at
-//! [rustmex](https://gitlab.com/nielstermeer/rustmex/-/blob/master/examples/catch_panic/src/lib.rs?ref_type=heads).
-
 mod error;
 mod types;
 
 use rustmex::{char::CharArray, prelude::*, MatlabClass};
 
 use error::{Error, MapMexError};
+use types::Mode;
 
 #[rustmex::entrypoint]
 fn serialbridge(lhs: Lhs, rhs: Rhs) -> rustmex::Result<()> {
     let arg0 = rhs.first().mexerr(Error::MissingSerialMode)?;
 
     // Get the mode argument ("Open", "Close", "Read", "Write")
-    let mode = get_mode(arg0);
+    let mode = get_mode(arg0)?;
 
-    let arg1 = rhs.get(1).error_if_missing(
-        "serialbridge:missing_input",
-        "Missing serial mode (second argument)",
-    )?;
+    // Dispatch to the appropriate function
+    match mode {
+        Mode::Open => open_serial(rhs)?,
+        Mode::Close => todo!(),
+        Mode::Read => todo!(),
+        Mode::Write => todo!(),
+    }
 
     Ok(())
 }
 
-fn get_mode(arg: &mxArray) -> Result<types::Mode, Error> {
+fn get_mode(arg: &mxArray) -> Result<Mode, Error> {
     CharArray::from_mx_array(arg)?
         .get_cstring()
         .into_string()?
         .parse()
 }
+
+fn open_serial(rhs: Rhs) -> Result<(), Error> {
+    let port = rhs.get(1).mexerr(Error::MissingPortName)?;
+    let baudrate = rhs.get(2).mexerr(Error::MissingBaudrate)?;
+
+    // let port = CharArray::from_mx_array(port)?.get_cstring().into_string()?;
+    // let baudrate = CharArray::from_mx_array(baudrate)?.get_cstring().into_string()?;
+
+    todo!();
+
+    Ok(())
+}
-- 
GitLab