use libc::c_void;
use crate::util::{go_iowritter::GoIOWritter, util::ref_free_drop, go_type::FFIError};
use self::ffi::nosqldb_logger_new;
pub(crate) mod ffi {
use std::mem;
use crate::util::{go_iowritter::{GoIOWritterPtr, GoIOWritter}, util::{ffi::FfiNosqldbPtrAndErrorNewReturn, c_char_to_str}, go_type::FFIError};
use super::{NosqldbLogger, LoggerLogLevel};
extern "C" {
pub fn ffi_nosqldb_logger_new(ioWritter_ptr: GoIOWritterPtr, level: LoggerLogLevel, useLocalTime: bool) -> FfiNosqldbPtrAndErrorNewReturn;
}
pub fn nosqldb_logger_new(
writter: GoIOWritter,
level: LoggerLogLevel,
use_local_time: bool,
) -> Result<NosqldbLogger, FFIError> {
let FfiNosqldbPtrAndErrorNewReturn { ptr: logger_ptr, go_error_ptr } = unsafe { ffi_nosqldb_logger_new(writter.go_io_writter_ptr, level, use_local_time) };
mem::forget(writter);
if go_error_ptr.is_null() {
Ok(NosqldbLogger { nosqldb_logger: logger_ptr })
} else {
Err(FFIError::GoError(c_char_to_str(go_error_ptr)?))
}
}
}
#[repr(C)]
pub enum LoggerLogLevel {
Fine = 10,
Trace = 15,
Debug = 20,
Info = 30,
Warn = 40,
Error = 50,
Off = 99,
}
pub(crate) type NosqldbLoggerPtr = *const c_void;
pub struct NosqldbLogger {
pub(crate) nosqldb_logger: NosqldbLoggerPtr,
}
impl NosqldbLogger {
pub fn new <T: std::io::Write + 'static> (
writter: T,
level: LoggerLogLevel,
use_local_time: bool,
) -> Result<Self, FFIError> {
let writter = GoIOWritter::new(writter);
nosqldb_logger_new(writter, level, use_local_time)
}
}
impl Drop for NosqldbLogger {
fn drop(&mut self) {
ref_free_drop(self.nosqldb_logger);
}
}