use serde::{Deserialize, Serialize};
use super::event::NodeId;
pub const DEFAULT_MAX_LOG_RING_RECORDS: usize = 2048;
#[derive(Clone, Copy, Debug, Eq, PartialEq, Ord, PartialOrd, Serialize, Deserialize)]
#[non_exhaustive]
pub enum LogLevel {
Trace,
Debug,
Info,
Warn,
Error,
}
#[derive(Clone, Debug, Eq, PartialEq, Serialize, Deserialize)]
pub struct LogRecord {
pub seq: u64,
pub ts_ms: u64,
pub level: LogLevel,
pub daemon_id: Option<u64>,
pub node_id: Option<NodeId>,
pub message: String,
#[serde(default)]
pub chain_pending: bool,
}
#[derive(Clone, Debug, Eq, PartialEq, Serialize, Deserialize)]
pub struct LogLine {
pub level: LogLevel,
pub daemon_id: Option<u64>,
pub message: String,
}
impl LogLine {
pub fn info(daemon_id: Option<u64>, message: impl Into<String>) -> Self {
Self {
level: LogLevel::Info,
daemon_id,
message: message.into(),
}
}
pub fn warn(daemon_id: Option<u64>, message: impl Into<String>) -> Self {
Self {
level: LogLevel::Warn,
daemon_id,
message: message.into(),
}
}
pub fn error(daemon_id: Option<u64>, message: impl Into<String>) -> Self {
Self {
level: LogLevel::Error,
daemon_id,
message: message.into(),
}
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn log_record_postcard_round_trips() {
let record = LogRecord {
seq: 42,
ts_ms: 1_700_000_000_000,
level: LogLevel::Warn,
daemon_id: Some(7),
node_id: Some(100),
message: "drain timeout".into(),
chain_pending: false,
};
let bytes = postcard::to_allocvec(&record).expect("encode");
let decoded: LogRecord = postcard::from_bytes(&bytes).expect("decode");
assert_eq!(decoded, record);
}
#[test]
fn log_line_helpers_set_level_and_daemon() {
let info = LogLine::info(Some(1), "hello");
assert_eq!(info.level, LogLevel::Info);
assert_eq!(info.daemon_id, Some(1));
assert_eq!(info.message, "hello");
let warn = LogLine::warn(None, "rtt high");
assert_eq!(warn.level, LogLevel::Warn);
assert!(warn.daemon_id.is_none());
let err = LogLine::error(Some(2), "crashed");
assert_eq!(err.level, LogLevel::Error);
}
#[test]
fn log_levels_order_lowest_to_highest_for_filter_thresholds() {
assert!(LogLevel::Trace < LogLevel::Debug);
assert!(LogLevel::Debug < LogLevel::Info);
assert!(LogLevel::Info < LogLevel::Warn);
assert!(LogLevel::Warn < LogLevel::Error);
}
}