use log::{Level, LevelFilter};
use memflow::cglue::IntError;
use memflow::error::Error;
use memflow::plugins::Inventory;
use std::num::NonZeroI32;
use std::ffi::CStr;
use std::os::raw::c_char;
#[no_mangle]
pub extern "C" fn log_init(level_filter: LevelFilter) {
simplelog::TermLogger::init(
level_filter,
simplelog::Config::default(),
simplelog::TerminalMode::Stdout,
simplelog::ColorChoice::Auto,
)
.unwrap();
}
#[no_mangle]
pub unsafe extern "C" fn log_error(s: *const c_char) {
if !s.is_null() {
let c_str = CStr::from_ptr(s);
if let Ok(r_str) = c_str.to_str() {
log::error!("{}", r_str);
}
}
}
#[no_mangle]
pub unsafe extern "C" fn log_warn(s: *const c_char) {
if !s.is_null() {
let c_str = CStr::from_ptr(s);
if let Ok(r_str) = c_str.to_str() {
log::warn!("{}", r_str);
}
}
}
#[no_mangle]
pub unsafe extern "C" fn log_info(s: *const c_char) {
if !s.is_null() {
let c_str = CStr::from_ptr(s);
if let Ok(r_str) = c_str.to_str() {
log::info!("{}", r_str);
}
}
}
#[no_mangle]
pub unsafe extern "C" fn log_debug(s: *const c_char) {
if !s.is_null() {
let c_str = CStr::from_ptr(s);
if let Ok(r_str) = c_str.to_str() {
log::debug!("{}", r_str);
}
}
}
#[no_mangle]
pub unsafe extern "C" fn log_trace(s: *const c_char) {
if !s.is_null() {
let c_str = CStr::from_ptr(s);
if let Ok(r_str) = c_str.to_str() {
log::trace!("{}", r_str);
}
}
}
#[no_mangle]
pub extern "C" fn log_errorcode(level: Level, error: i32) {
if let Some(error) = NonZeroI32::new(error) {
log::log!(level, "{}", <Error as IntError>::from_int_err(error));
}
}
#[no_mangle]
pub extern "C" fn log_debug_errorcode(error: i32) {
log_errorcode(Level::Debug, error)
}
#[no_mangle]
pub extern "C" fn log_set_max_level(level_filter: LevelFilter, inventory: Option<&Inventory>) {
if let Some(inventory) = inventory {
inventory.set_max_log_level(level_filter);
} else {
log::set_max_level(level_filter);
}
}