use crate::core_types::logging::LogMessage;
use crate::error::RustecalError;
use crate::log_level::LogLevel;
use std::{ffi::CString, ptr, slice};
pub struct Log;
impl Log {
pub fn log(level: LogLevel, message: &str) {
let cstr =
CString::new(message).unwrap_or_else(|_| CString::new("<invalid UTF-8>").unwrap());
unsafe {
rustecal_sys::eCAL_Logging_Log(level.into(), cstr.as_ptr());
}
}
pub fn get_logging() -> Result<Vec<LogMessage>, RustecalError> {
let mut raw_ptr: *mut rustecal_sys::eCAL_Logging_SLogging = ptr::null_mut();
let ret = unsafe { rustecal_sys::eCAL_Logging_GetLogging(&mut raw_ptr) };
if ret != 0 {
return Ok(Vec::new());
}
if raw_ptr.is_null() {
return Err(RustecalError::NullPointer);
}
let logs = unsafe {
let logging = &*raw_ptr;
let raw_messages = logging.log_messages;
let len = logging.log_messages_length;
let entries = slice::from_raw_parts(raw_messages, len)
.iter()
.map(|msg| LogMessage::from(*msg))
.collect();
rustecal_sys::eCAL_Free(raw_ptr as *mut _);
entries
};
Ok(logs)
}
}