1use std::ffi::CStr;
7use std::os::raw::c_char;
8
9use super::HddsError;
10
11#[repr(C)]
13#[derive(Debug, Clone, Copy, PartialEq, Eq)]
14pub enum HddsLogLevel {
15 HddsLogOff = 0,
16 HddsLogError = 1,
17 HddsLogWarn = 2,
18 HddsLogInfo = 3,
19 HddsLogDebug = 4,
20 HddsLogTrace = 5,
21}
22
23impl From<HddsLogLevel> for log::LevelFilter {
24 fn from(level: HddsLogLevel) -> Self {
25 match level {
26 HddsLogLevel::HddsLogOff => log::LevelFilter::Off,
27 HddsLogLevel::HddsLogError => log::LevelFilter::Error,
28 HddsLogLevel::HddsLogWarn => log::LevelFilter::Warn,
29 HddsLogLevel::HddsLogInfo => log::LevelFilter::Info,
30 HddsLogLevel::HddsLogDebug => log::LevelFilter::Debug,
31 HddsLogLevel::HddsLogTrace => log::LevelFilter::Trace,
32 }
33 }
34}
35
36#[no_mangle]
52pub unsafe extern "C" fn hdds_logging_init(level: HddsLogLevel) -> HddsError {
53 let filter: log::LevelFilter = level.into();
54
55 match env_logger::Builder::new()
56 .filter_level(filter)
57 .format_timestamp_millis()
58 .try_init()
59 {
60 Ok(()) => HddsError::HddsOk,
61 Err(_) => HddsError::HddsOperationFailed, }
63}
64
65#[no_mangle]
78pub unsafe extern "C" fn hdds_logging_init_env(default_level: HddsLogLevel) -> HddsError {
79 let filter: log::LevelFilter = default_level.into();
80
81 match env_logger::Builder::from_env(
82 env_logger::Env::default().default_filter_or(filter.to_string()),
83 )
84 .format_timestamp_millis()
85 .try_init()
86 {
87 Ok(()) => HddsError::HddsOk,
88 Err(_) => HddsError::HddsOperationFailed,
89 }
90}
91
92#[no_mangle]
108pub unsafe extern "C" fn hdds_logging_init_with_filter(filter: *const c_char) -> HddsError {
109 if filter.is_null() {
110 return HddsError::HddsInvalidArgument;
111 }
112
113 let Ok(filter_str) = CStr::from_ptr(filter).to_str() else {
114 return HddsError::HddsInvalidArgument;
115 };
116
117 match env_logger::Builder::new()
118 .parse_filters(filter_str)
119 .format_timestamp_millis()
120 .try_init()
121 {
122 Ok(()) => HddsError::HddsOk,
123 Err(_) => HddsError::HddsOperationFailed,
124 }
125}