use std::{cell, ffi}; #[derive(Default)] pub struct Logger { callback: cell::Cell, level: cell::Cell, } impl Logger { pub(crate) fn set_callback(&self, callback: crate::LibsessionLogFn) { self.callback.set(callback); } pub(crate) fn set_level(&self, level: crate::LibsessionLogLevel) { self.level.set(level); } pub(crate) const fn level(&self) -> crate::LibsessionLogLevel { self.level.get() } pub(crate) fn log(&self, level: crate::LibsessionLogLevel, message: impl FnOnce() -> String) { if level == crate::LibsessionLogLevel::Off || level > self.level.get() { return; } let Some(callback) = self.callback.get() else { return; }; let Ok(message) = ffi::CString::new(message().replace('\0', "\\0")) else { return; }; unsafe { callback(level, message.as_ptr()) }; } }