use core::ffi::{c_char, c_int, c_uint};
pub struct Hilogger {
level: log::LevelFilter,
}
impl Default for Hilogger {
fn default() -> Self {
Self {
level: log::LevelFilter::Info,
}
}
}
impl Hilogger {
pub fn level(self, level: log::LevelFilter) -> Self {
Self { level, ..self }
}
pub fn init(self) -> Result<(), log::SetLoggerError> {
log::set_max_level(self.level);
log::set_boxed_logger(Box::new(self))
}
}
impl log::Log for Hilogger {
fn enabled(&self, metadata: &log::Metadata) -> bool {
metadata.level().to_level_filter() <= self.level
}
fn log(&self, record: &log::Record) {
let level = match record.level() {
log::Level::Error => LogLevel::ERROR,
log::Level::Warn => LogLevel::WARN,
log::Level::Info => LogLevel::INFO,
log::Level::Debug => LogLevel::DEBUG,
log::Level::Trace => LogLevel::DEBUG,
};
let tag = std::ffi::CString::new(record.target());
let tag = tag.as_ref().map(std::ffi::CString::as_c_str).unwrap_or(c"");
let msg = std::ffi::CString::new(format!("{}", record.args()));
let msg = msg.as_ref().map(std::ffi::CString::as_c_str).unwrap_or(c"");
unsafe { OH_LOG_Print(LOG_APP, level, 0, tag.as_ptr(), msg.as_ptr()) };
}
fn flush(&self) {}
}
#[repr(transparent)]
#[derive(Clone, Copy)]
pub struct LogType(pub ::std::os::raw::c_uint);
pub const LOG_APP: LogType = LogType(0);
#[repr(C)]
#[derive(Clone, Copy)]
pub enum LogLevel {
DEBUG = 3,
INFO = 4,
WARN = 5,
ERROR = 6,
FATAL = 7,
}
#[link(name = "hilog_ndk.z")]
unsafe extern "C" {
pub unsafe fn OH_LOG_Print(type_: LogType, level: LogLevel, domain: c_uint, tag: *const c_char, fmt: *const c_char, ...) -> c_int;
}