oli_server/app/
logger.rs

1use anyhow::Result;
2use std::path::PathBuf;
3
4/// Logger trait for writing logs to a file and displaying them in the TUI
5pub trait Logger {
6    /// Log a message with optional formatting arguments
7    fn log(&mut self, message: &str, args: &[&str]);
8
9    /// Toggle between showing logs and normal output
10    fn toggle_log_view(&mut self);
11
12    /// Get the log directory path
13    fn get_log_directory(&self) -> PathBuf;
14
15    /// Get the log file path for the current session
16    fn get_log_file_path(&self) -> PathBuf;
17
18    /// Write a log message to file
19    fn write_log_to_file(&self, message: &str) -> Result<()>;
20}
21
22/// Log level for messages
23#[derive(Debug, Clone, Copy, PartialEq)]
24pub enum LogLevel {
25    /// Debug level for detailed information
26    Debug,
27    /// Info level for general information
28    Info,
29    /// Warning level for potential issues
30    Warning,
31    /// Error level for error conditions
32    Error,
33}
34
35impl LogLevel {
36    /// Get a string representation of the log level
37    pub fn as_str(&self) -> &'static str {
38        match self {
39            LogLevel::Debug => "DEBUG",
40            LogLevel::Info => "INFO",
41            LogLevel::Warning => "WARN",
42            LogLevel::Error => "ERROR",
43        }
44    }
45
46    /// Get a color code for the log level
47    pub fn color_code(&self) -> &'static str {
48        match self {
49            LogLevel::Debug => "\x1b[36m",   // Cyan
50            LogLevel::Info => "\x1b[32m",    // Green
51            LogLevel::Warning => "\x1b[33m", // Yellow
52            LogLevel::Error => "\x1b[31m",   // Red
53        }
54    }
55}
56
57/// Format a log message with level, timestamp, and message
58pub fn format_log(level: LogLevel, message: &str) -> String {
59    let now = chrono::Local::now();
60    let timestamp = now.format("%Y-%m-%d %H:%M:%S%.3f");
61
62    format!("[{}] [{}] {}", timestamp, level.as_str(), message)
63}
64
65/// Format a log message with color for terminal display
66pub fn format_log_with_color(level: LogLevel, message: &str) -> String {
67    let now = chrono::Local::now();
68    let timestamp = now.format("%Y-%m-%d %H:%M:%S%.3f");
69    let reset = "\x1b[0m";
70
71    format!(
72        "[{}] [{}{}{}] {}",
73        timestamp,
74        level.color_code(),
75        level.as_str(),
76        reset,
77        message
78    )
79}