systemctl_tui/components/
logger.rs1use 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}