dwd 0.5.0

High performance traffic generator
Documentation
use ratatui::{
    layout::{Constraint, Layout, Rect},
    style::{Color, Modifier, Style},
    text::{Line, Span},
    widgets::{Block, Paragraph, Wrap},
    Frame,
};

#[derive(Debug, Clone, Copy)]
pub enum Mode {
    Manual,
    Running(bool),
}

pub struct StatusWidget {
    version: &'static str,
    mode: Mode,
}

impl StatusWidget {
    pub fn new() -> Self {
        Self {
            version: env!("CARGO_PKG_VERSION"),
            mode: Mode::Running(true),
        }
    }

    pub fn mode(&self) -> Mode {
        self.mode
    }

    pub fn set_mode(&mut self, mode: Mode) {
        self.mode = mode;
    }

    pub fn draw(&mut self, frame: &mut Frame, area: Rect) {
        let block = Block::bordered()
            .border_style(Style::default().fg(Color::DarkGray))
            .title(Span::styled(
                "DWD",
                Style::default().fg(Color::Magenta).add_modifier(Modifier::BOLD),
            ));
        frame.render_widget(block, area);

        let [area] = Layout::vertical([Constraint::Percentage(100)])
            .horizontal_margin(2)
            .vertical_margin(1)
            .areas(area);

        let mut text = vec![Line::from(vec![Span::raw("Version: "), Span::raw(self.version)])];
        let span = match self.mode {
            Mode::Manual => Span::styled("Manual", Style::default().fg(Color::Yellow)),
            Mode::Running(true) => Span::styled("Running", Style::default().fg(Color::Green)),
            Mode::Running(false) => Span::styled("Suspended", Style::default().fg(Color::Red)),
        };
        text.push(Line::from(vec![Span::raw("Mode: "), span]));

        let widget = Paragraph::new(text).wrap(Wrap { trim: true });

        frame.render_widget(widget, area);
    }
}