use std::cell::RefCell;
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum MessageLevel {
Log,
Warning,
Error,
Debug,
Info,
}
impl MessageLevel {
pub fn as_cdp_str(self) -> &'static str {
match self {
Self::Log => "log",
Self::Warning => "warning",
Self::Error => "error",
Self::Debug => "debug",
Self::Info => "info",
}
}
}
#[derive(Debug, Clone)]
pub struct ConsoleMessage {
pub level: MessageLevel,
pub text: String,
}
thread_local! {
static MESSAGES: RefCell<Vec<ConsoleMessage>> = const { RefCell::new(Vec::new()) };
}
pub fn push_console_message(msg: ConsoleMessage) {
MESSAGES.with(|m| m.borrow_mut().push(msg));
}
pub fn drain_messages() -> Vec<ConsoleMessage> {
MESSAGES.with(|m| m.borrow_mut().drain(..).collect())
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_push_and_drain_messages() {
let _ = drain_messages();
push_console_message(ConsoleMessage {
level: MessageLevel::Log,
text: "one".to_string(),
});
push_console_message(ConsoleMessage {
level: MessageLevel::Error,
text: "two".to_string(),
});
let msgs = drain_messages();
assert_eq!(msgs.len(), 2);
assert_eq!(msgs[0].text, "one");
assert_eq!(msgs[0].level, MessageLevel::Log);
assert_eq!(msgs[1].text, "two");
assert_eq!(msgs[1].level, MessageLevel::Error);
}
#[test]
fn test_drain_empties_buffer() {
let _ = drain_messages();
push_console_message(ConsoleMessage {
level: MessageLevel::Warning,
text: "warn".to_string(),
});
let first = drain_messages();
assert_eq!(first.len(), 1);
let second = drain_messages();
assert!(second.is_empty());
}
#[test]
fn test_drain_empty_returns_empty() {
let _ = drain_messages();
let msgs = drain_messages();
assert!(msgs.is_empty());
}
#[test]
fn test_message_level_as_cdp_str() {
assert_eq!(MessageLevel::Log.as_cdp_str(), "log");
assert_eq!(MessageLevel::Warning.as_cdp_str(), "warning");
assert_eq!(MessageLevel::Error.as_cdp_str(), "error");
assert_eq!(MessageLevel::Debug.as_cdp_str(), "debug");
assert_eq!(MessageLevel::Info.as_cdp_str(), "info");
}
}