dwipe 0.1.4

Fast, cross-platform disk cleanup tool with interactive UI
Documentation
use std::collections::{HashMap, VecDeque};
use std::time::{SystemTime, UNIX_EPOCH};

#[derive(Debug)]
pub enum MessageLevel {
    Info,
    Error,
}

#[derive(Debug)]
pub struct Logger {
    pub messages: VecDeque<(u128, MessageLevel, String)>,
    timers: HashMap<String, SystemTime>,
}

impl Default for Logger {
    fn default() -> Self {
        Self::new()
    }
}

impl Logger {
    fn new() -> Self {
        Logger {
            messages: VecDeque::new(),
            timers: HashMap::new(),
        }
    }

    pub fn log(&mut self, message: String) {
        let timestamp = SystemTime::now()
            .duration_since(UNIX_EPOCH)
            .expect("Time went backwards")
            .as_millis();

        if self.messages.len() >= 30 {
            self.messages.pop_back();
        }
        self.messages
            .push_front((timestamp, MessageLevel::Info, message));
    }

    pub fn start_timer(&mut self, name: &str) {
        if !self.timers.contains_key(name) {
            let timestamp = SystemTime::now();
            self.timers.insert(name.to_string(), timestamp);
        }
    }

    pub fn stop_timer(&mut self, name: &str) {
        if let Some(start_time) = self.timers.remove(name) {
            let diff = SystemTime::now()
                .duration_since(start_time)
                .expect("Time went backwards")
                .as_secs_f64();
            self.log(format!("[{}]: {:.1}s", name, diff));
        }
    }
}