Skip to main content

wiki_tui/components/
logger.rs

1use std::sync::Arc;
2
3use anyhow::Result;
4use ratatui::{
5    prelude::Rect,
6    style::{Color, Style},
7};
8use tokio::sync::mpsc;
9use tui_logger::{TuiLoggerWidget, TuiWidgetState};
10
11use crate::{
12    action::Action,
13    config::{Config, Theme},
14    terminal::Frame,
15};
16
17use super::Component;
18
19#[derive(Default)]
20pub struct LoggerComponent {
21    state: TuiWidgetState,
22    config: Arc<Config>,
23    theme: Arc<Theme>,
24}
25
26impl Component for LoggerComponent {
27    fn init(
28        &mut self,
29        _: mpsc::UnboundedSender<Action>,
30        config: Arc<Config>,
31        theme: Arc<Theme>,
32    ) -> Result<()> {
33        self.state = TuiWidgetState::new();
34        self.config = config;
35        self.theme = theme;
36        Ok(())
37    }
38
39    fn render(&mut self, frame: &mut Frame<'_>, size: Rect) {
40        let widget = TuiLoggerWidget::default()
41            .block(self.theme.default_block().title("Log"))
42            .style_error(Style::default().fg(Color::Red))
43            .style_warn(Style::default().fg(Color::Yellow))
44            .style_info(Style::default().fg(Color::Cyan))
45            .style_debug(Style::default().fg(Color::Green))
46            .style_trace(Style::default().fg(Color::Magenta))
47            .state(&self.state);
48        frame.render_widget(widget, size)
49    }
50}