Skip to main content

fui/
logger.rs

1use crate::ffi;
2
3fn write_log(category: &str, message: &str) {
4    let category_bytes = category.as_bytes();
5    let message_bytes = message.as_bytes();
6    unsafe {
7        ffi::fui_log(
8            if category_bytes.is_empty() {
9                0
10            } else {
11                category_bytes.as_ptr() as usize
12            },
13            category_bytes.len() as u32,
14            if message_bytes.is_empty() {
15                0
16            } else {
17                message_bytes.as_ptr() as usize
18            },
19            message_bytes.len() as u32,
20        )
21    }
22}
23
24pub fn logs_enabled() -> bool {
25    unsafe { ffi::fui_logs_enabled() }
26}
27
28pub fn log(category: &str, message: &str) {
29    if !logs_enabled() {
30        return;
31    }
32    write_log(category, message);
33}
34
35pub fn warn(category: &str, message: &str) {
36    write_log(&format!("Warning/{category}"), message);
37}
38
39pub fn error(category: &str, message: &str) {
40    write_log(&format!("Error/{category}"), message);
41}
42
43#[cfg(test)]
44mod tests {
45    use crate::ffi::{self, Call};
46
47    #[test]
48    fn log_respects_logs_enabled() {
49        ffi::test::reset();
50        ffi::test::set_logs_enabled(false);
51        super::log("test", "message");
52        let calls = ffi::test::take_calls();
53        assert!(calls.iter().any(|call| matches!(call, Call::LogsEnabled)));
54        assert!(!calls.iter().any(|call| matches!(call, Call::Log { .. })));
55    }
56}