// use std::num::NonZeroUsize; #[derive(Debug, Clone)] pub struct DebugLog { enabled: bool, current: String, history: Vec, // max_history: Option, // pos: usize, } impl DebugLog { pub fn new() -> Self { Self { enabled: false, current: String::new(), history: vec![], // max_history: None, // pos: 0, } } pub fn rotate(&mut self) { // if self.current.len() > 500 { let mut rot = std::mem::take(&mut self.current); self.current = rot.split_off(rot.rfind('\n').unwrap_or(rot.len())); // if let Some(max) = self.max_history { // if self.history.len() < max.into() { // self.history.extend(rot.lines().map(|s| s.to_owned())); // } else { // self.history[self.pos] = rot; // self.pos = (self.pos + 1) % max.get(); // } // } else { // self.history.push(rot); self.history.extend(rot.lines().map(|s| s.to_owned())); // } // } } // pub fn current(&self) -> &str { // &self.current // } pub fn history(&self) -> &[String] { &self.history[self.history.len().saturating_sub(100)..] } pub fn pop(&mut self) -> Option { self.history.pop() } pub fn enable(&mut self) { self.enabled = true; } pub fn enabled(&self) -> bool { self.enabled } } impl std::fmt::Write for DebugLog { fn write_str(&mut self, s: &str) -> std::fmt::Result { if self.enabled { let tmp = self.current.write_str(s); self.rotate(); tmp } else { Ok(()) } } fn write_char(&mut self, c: char) -> std::fmt::Result { if self.enabled { let tmp = self.current.write_char(c); self.rotate(); tmp } else { Ok(()) } } fn write_fmt(&mut self, args: std::fmt::Arguments<'_>) -> std::fmt::Result { if self.enabled { let tmp = self.current.write_fmt(args); self.rotate(); tmp } else { Ok(()) } } } impl Default for DebugLog { fn default() -> Self { Self::new() } }