mod bindings; pub mod types; use bindings::SSV_LireConfig; use std::{fmt, ptr}; use types::serialization_types::{read_from_buffer, Configuration}; #[derive(Debug)] pub struct SesamVitaleError { code: u16, } impl fmt::Display for SesamVitaleError { fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { write!(f, "Got error code {} from SSV_LireConfig", self.code) } } pub fn read_config() -> Result { let mut buffer_ptr: *mut libc::c_void = ptr::null_mut(); let mut size: libc::size_t = 0; let buffer_ptr_ptr: *mut *mut libc::c_void = &mut buffer_ptr; let size_ptr: *mut libc::size_t = &mut size; // Need to add proper error handling -> return a result with error code pointing to an error // enum let exit_code: u16 = unsafe { SSV_LireConfig(buffer_ptr_ptr, size_ptr) }; if exit_code != 0 { let error = SesamVitaleError { code: exit_code }; return Err(error); }; let buffer: &[u8] = unsafe { std::slice::from_raw_parts(buffer_ptr as *const u8, size) }; // TODO: Improve error handling let configuration: Configuration = read_from_buffer(buffer).unwrap(); // TODO: Call library function for memory delocating unsafe { libc::free(buffer_ptr) }; Ok(configuration) } #[cfg(test)] mod tests {}