hilogger 0.1.0

a ohos hilog bind to log.
Documentation
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;
}