From 91800cf95a583cfd4fa093b3711d513b03691741 Mon Sep 17 00:00:00 2001 From: bQUARKz Date: Sun, 18 Jan 2026 04:48:49 +0000 Subject: [PATCH] split log --- crates/prometeu-core/src/log/log_event.rs | 13 ++ crates/prometeu-core/src/log/log_level.rs | 8 ++ crates/prometeu-core/src/log/log_service.rs | 93 ++++++++++++++ crates/prometeu-core/src/log/log_source.rs | 8 ++ crates/prometeu-core/src/log/mod.rs | 128 ++------------------ 5 files changed, 130 insertions(+), 120 deletions(-) create mode 100644 crates/prometeu-core/src/log/log_event.rs create mode 100644 crates/prometeu-core/src/log/log_level.rs create mode 100644 crates/prometeu-core/src/log/log_service.rs create mode 100644 crates/prometeu-core/src/log/log_source.rs diff --git a/crates/prometeu-core/src/log/log_event.rs b/crates/prometeu-core/src/log/log_event.rs new file mode 100644 index 00000000..a35382b9 --- /dev/null +++ b/crates/prometeu-core/src/log/log_event.rs @@ -0,0 +1,13 @@ +use crate::log::LogLevel; +use crate::log::LogSource; + +#[derive(Debug, Clone)] +pub struct LogEvent { + pub seq: u64, + pub ts_ms: u64, + pub frame: u64, + pub level: LogLevel, + pub source: LogSource, + pub tag: u16, + pub msg: String, +} diff --git a/crates/prometeu-core/src/log/log_level.rs b/crates/prometeu-core/src/log/log_level.rs new file mode 100644 index 00000000..25d8072c --- /dev/null +++ b/crates/prometeu-core/src/log/log_level.rs @@ -0,0 +1,8 @@ +#[derive(Debug, Clone, Copy, PartialEq, Eq)] +pub enum LogLevel { + Trace, + Debug, + Info, + Warn, + Error, +} diff --git a/crates/prometeu-core/src/log/log_service.rs b/crates/prometeu-core/src/log/log_service.rs new file mode 100644 index 00000000..f81395af --- /dev/null +++ b/crates/prometeu-core/src/log/log_service.rs @@ -0,0 +1,93 @@ +use std::collections::VecDeque; +use crate::log::{LogEvent, LogLevel, LogSource}; + +pub struct LogService { + events: VecDeque, + capacity: usize, + next_seq: u64, +} + +impl LogService { + pub fn new(capacity: usize) -> Self { + Self { + events: VecDeque::with_capacity(capacity), + capacity, + next_seq: 0, + } + } + + pub fn log(&mut self, ts_ms: u64, frame: u64, level: LogLevel, source: LogSource, tag: u16, msg: String) { + if self.events.len() >= self.capacity { + self.events.pop_front(); + } + self.events.push_back(LogEvent { + seq: self.next_seq, + ts_ms, + frame, + level, + source, + tag, + msg, + }); + self.next_seq += 1; + } + + pub fn get_recent(&self, n: usize) -> Vec { + self.events.iter().rev().take(n).cloned().collect::>().into_iter().rev().collect() + } + + pub fn get_after(&self, seq: u64) -> Vec { + self.events.iter().filter(|e| e.seq > seq).cloned().collect() + } + + pub fn last_seq(&self) -> Option { + self.events.back().map(|e| e.seq) + } +} + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn test_ring_buffer_capacity() { + let mut service = LogService::new(3); + service.log(100, 1, LogLevel::Info, LogSource::Pos, 0, "Log 1".to_string()); + service.log(110, 1, LogLevel::Info, LogSource::Pos, 0, "Log 2".to_string()); + service.log(120, 1, LogLevel::Info, LogSource::Pos, 0, "Log 3".to_string()); + + assert_eq!(service.events.len(), 3); + assert_eq!(service.events[0].msg, "Log 1"); + + service.log(130, 1, LogLevel::Info, LogSource::Pos, 0, "Log 4".to_string()); + assert_eq!(service.events.len(), 3); + assert_eq!(service.events[0].msg, "Log 2"); + assert_eq!(service.events[2].msg, "Log 4"); + } + + #[test] + fn test_get_recent() { + let mut service = LogService::new(10); + for i in 0..5 { + service.log(i as u64, 1, LogLevel::Info, LogSource::Pos, 0, format!("Log {}", i)); + } + + let recent = service.get_recent(2); + assert_eq!(recent.len(), 2); + assert_eq!(recent[0].msg, "Log 3"); + assert_eq!(recent[1].msg, "Log 4"); + } + + #[test] + fn test_get_after() { + let mut service = LogService::new(10); + for i in 0..5 { + service.log(i as u64, 1, LogLevel::Info, LogSource::Pos, 0, format!("Log {}", i)); + } + + let after = service.get_after(2); // seqs são 0, 1, 2, 3, 4. Deve retornar 3 e 4. + assert_eq!(after.len(), 2); + assert_eq!(after[0].msg, "Log 3"); + assert_eq!(after[1].msg, "Log 4"); + } +} diff --git a/crates/prometeu-core/src/log/log_source.rs b/crates/prometeu-core/src/log/log_source.rs new file mode 100644 index 00000000..a9ed33a4 --- /dev/null +++ b/crates/prometeu-core/src/log/log_source.rs @@ -0,0 +1,8 @@ +#[derive(Debug, Clone, Copy, PartialEq, Eq)] +pub enum LogSource { + Pos, + Hub, + Vm, + Fs, + App { app_id: u32 }, +} diff --git a/crates/prometeu-core/src/log/mod.rs b/crates/prometeu-core/src/log/mod.rs index 18e4ee4d..547faf77 100644 --- a/crates/prometeu-core/src/log/mod.rs +++ b/crates/prometeu-core/src/log/mod.rs @@ -1,121 +1,9 @@ -use std::collections::VecDeque; +mod log_level; +mod log_source; +mod log_event; +mod log_service; -#[derive(Debug, Clone, Copy, PartialEq, Eq)] -pub enum LogLevel { - Trace, - Debug, - Info, - Warn, - Error, -} - -#[derive(Debug, Clone, Copy, PartialEq, Eq)] -pub enum LogSource { - Pos, - Hub, - Vm, - Fs, - App { app_id: u32 }, -} - -#[derive(Debug, Clone)] -pub struct LogEvent { - pub seq: u64, - pub ts_ms: u64, - pub frame: u64, - pub level: LogLevel, - pub source: LogSource, - pub tag: u16, - pub msg: String, -} - -pub struct LogService { - events: VecDeque, - capacity: usize, - next_seq: u64, -} - -impl LogService { - pub fn new(capacity: usize) -> Self { - Self { - events: VecDeque::with_capacity(capacity), - capacity, - next_seq: 0, - } - } - - pub fn log(&mut self, ts_ms: u64, frame: u64, level: LogLevel, source: LogSource, tag: u16, msg: String) { - if self.events.len() >= self.capacity { - self.events.pop_front(); - } - self.events.push_back(LogEvent { - seq: self.next_seq, - ts_ms, - frame, - level, - source, - tag, - msg, - }); - self.next_seq += 1; - } - - pub fn get_recent(&self, n: usize) -> Vec { - self.events.iter().rev().take(n).cloned().collect::>().into_iter().rev().collect() - } - - pub fn get_after(&self, seq: u64) -> Vec { - self.events.iter().filter(|e| e.seq > seq).cloned().collect() - } - - pub fn last_seq(&self) -> Option { - self.events.back().map(|e| e.seq) - } -} - -#[cfg(test)] -mod tests { - use super::*; - - #[test] - fn test_ring_buffer_capacity() { - let mut service = LogService::new(3); - service.log(100, 1, LogLevel::Info, LogSource::Pos, 0, "Log 1".to_string()); - service.log(110, 1, LogLevel::Info, LogSource::Pos, 0, "Log 2".to_string()); - service.log(120, 1, LogLevel::Info, LogSource::Pos, 0, "Log 3".to_string()); - - assert_eq!(service.events.len(), 3); - assert_eq!(service.events[0].msg, "Log 1"); - - service.log(130, 1, LogLevel::Info, LogSource::Pos, 0, "Log 4".to_string()); - assert_eq!(service.events.len(), 3); - assert_eq!(service.events[0].msg, "Log 2"); - assert_eq!(service.events[2].msg, "Log 4"); - } - - #[test] - fn test_get_recent() { - let mut service = LogService::new(10); - for i in 0..5 { - service.log(i as u64, 1, LogLevel::Info, LogSource::Pos, 0, format!("Log {}", i)); - } - - let recent = service.get_recent(2); - assert_eq!(recent.len(), 2); - assert_eq!(recent[0].msg, "Log 3"); - assert_eq!(recent[1].msg, "Log 4"); - } - - #[test] - fn test_get_after() { - let mut service = LogService::new(10); - for i in 0..5 { - service.log(i as u64, 1, LogLevel::Info, LogSource::Pos, 0, format!("Log {}", i)); - } - - let after = service.get_after(2); // seqs são 0, 1, 2, 3, 4. Deve retornar 3 e 4. - assert_eq!(after.len(), 2); - assert_eq!(after[0].msg, "Log 3"); - assert_eq!(after[1].msg, "Log 4"); - } -} +pub use log_level::LogLevel; +pub use log_source::LogSource; +pub use log_event::LogEvent; +pub use log_service::LogService;