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}