fui-rs 0.2.4

Retained-mode Rust UI SDK for EffinDOM
Documentation
use crate::ffi;

fn write_log(category: &str, message: &str) {
    let category_bytes = category.as_bytes();
    let message_bytes = message.as_bytes();
    unsafe {
        ffi::fui_log(
            if category_bytes.is_empty() {
                0
            } else {
                category_bytes.as_ptr() as usize
            },
            category_bytes.len() as u32,
            if message_bytes.is_empty() {
                0
            } else {
                message_bytes.as_ptr() as usize
            },
            message_bytes.len() as u32,
        )
    }
}

pub fn logs_enabled() -> bool {
    unsafe { ffi::fui_logs_enabled() }
}

pub fn log(category: &str, message: &str) {
    if !logs_enabled() {
        return;
    }
    write_log(category, message);
}

pub fn warn(category: &str, message: &str) {
    write_log(&format!("Warning/{category}"), message);
}

pub fn error(category: &str, message: &str) {
    write_log(&format!("Error/{category}"), message);
}

#[cfg(test)]
mod tests {
    use crate::ffi::{self, Call};

    #[test]
    fn log_respects_logs_enabled() {
        ffi::test::reset();
        ffi::test::set_logs_enabled(false);
        super::log("test", "message");
        let calls = ffi::test::take_calls();
        assert!(calls.iter().any(|call| matches!(call, Call::LogsEnabled)));
        assert!(!calls.iter().any(|call| matches!(call, Call::Log { .. })));
    }
}