use std::ffi::CStr;
use std::os::raw::c_char;
use super::HddsError;
#[repr(C)]
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum HddsLogLevel {
HddsLogOff = 0,
HddsLogError = 1,
HddsLogWarn = 2,
HddsLogInfo = 3,
HddsLogDebug = 4,
HddsLogTrace = 5,
}
impl From<HddsLogLevel> for log::LevelFilter {
fn from(level: HddsLogLevel) -> Self {
match level {
HddsLogLevel::HddsLogOff => log::LevelFilter::Off,
HddsLogLevel::HddsLogError => log::LevelFilter::Error,
HddsLogLevel::HddsLogWarn => log::LevelFilter::Warn,
HddsLogLevel::HddsLogInfo => log::LevelFilter::Info,
HddsLogLevel::HddsLogDebug => log::LevelFilter::Debug,
HddsLogLevel::HddsLogTrace => log::LevelFilter::Trace,
}
}
}
#[no_mangle]
pub unsafe extern "C" fn hdds_logging_init(level: HddsLogLevel) -> HddsError {
let filter: log::LevelFilter = level.into();
match env_logger::Builder::new()
.filter_level(filter)
.format_timestamp_millis()
.try_init()
{
Ok(()) => HddsError::HddsOk,
Err(_) => HddsError::HddsOperationFailed, }
}
#[no_mangle]
pub unsafe extern "C" fn hdds_logging_init_env(default_level: HddsLogLevel) -> HddsError {
let filter: log::LevelFilter = default_level.into();
match env_logger::Builder::from_env(
env_logger::Env::default().default_filter_or(filter.to_string()),
)
.format_timestamp_millis()
.try_init()
{
Ok(()) => HddsError::HddsOk,
Err(_) => HddsError::HddsOperationFailed,
}
}
#[no_mangle]
pub unsafe extern "C" fn hdds_logging_init_with_filter(filter: *const c_char) -> HddsError {
if filter.is_null() {
return HddsError::HddsInvalidArgument;
}
let Ok(filter_str) = CStr::from_ptr(filter).to_str() else {
return HddsError::HddsInvalidArgument;
};
match env_logger::Builder::new()
.parse_filters(filter_str)
.format_timestamp_millis()
.try_init()
{
Ok(()) => HddsError::HddsOk,
Err(_) => HddsError::HddsOperationFailed,
}
}