Skip to main content

systemctl_tui/components/
logger.rs

1use anyhow::Result;
2use log::LevelFilter;
3use ratatui::{
4  layout::Rect,
5  style::{Color, Style},
6  widgets::{Block, BorderType, Borders},
7};
8use tokio::sync::mpsc::UnboundedSender;
9use tui_logger::{TuiLoggerLevelOutput, TuiLoggerWidget, TuiWidgetState};
10
11use super::{Component, Frame};
12use crate::action::Action;
13
14#[derive(Default)]
15pub struct Logger {
16  state: TuiWidgetState,
17}
18
19impl Component for Logger {
20  fn init(&mut self, _: UnboundedSender<Action>) -> Result<()> {
21    self.state = TuiWidgetState::new().set_default_display_level(LevelFilter::Debug);
22    Ok(())
23  }
24
25  fn render(&mut self, f: &mut Frame<'_>, rect: Rect) {
26    let w = TuiLoggerWidget::default()
27      .block(Block::default().title("─systemctl-tui logs").borders(Borders::ALL).border_type(BorderType::Rounded))
28      .style_error(Style::default().fg(Color::Red))
29      .style_debug(Style::default().fg(Color::Green))
30      .style_warn(Style::default().fg(Color::Yellow))
31      .style_trace(Style::default().fg(Color::Magenta))
32      .style_info(Style::default().fg(Color::Cyan))
33      .output_separator(':')
34      .output_timestamp(Some("%H:%M:%S".to_string()))
35      .output_level(Some(TuiLoggerLevelOutput::Long))
36      .output_target(false)
37      .output_file(true)
38      .output_line(true)
39      .state(&self.state);
40    f.render_widget(w, rect);
41  }
42}