libsession-sys 0.1.1

session management daemon
Documentation
use std::{cell, ffi};

#[derive(Default)]
pub struct Logger {
    callback: cell::Cell<crate::LibsessionLogFn>,
    level: cell::Cell<crate::LibsessionLogLevel>,
}

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()) };
    }
}