fumble 0.6.1

an oxidized implementation of the original clumsy tool, designed to simulate adverse network conditions on Windows systems.
use crate::cli::tui::traits::{DisplayName, HandleInput, IsActive, KeyBindings};
use crate::cli::tui::widgets::bandwidth_widget::BandwidthWidget;
use crate::cli::tui::widgets::delay_widget::DelayWidget;
use crate::cli::tui::widgets::drop_widget::DropWidget;
use crate::cli::tui::widgets::duplicate_widget::DuplicateWidget;
use crate::cli::tui::widgets::reorder_widget::ReorderWidget;
use crate::cli::tui::widgets::tamper_widget::TamperWidget;
use crate::cli::tui::widgets::throttle_widget::ThrottleWidget;
use ratatui::buffer::Buffer;
use ratatui::crossterm::event::KeyEvent;
use ratatui::layout::Rect;
use ratatui::widgets::Widget;

pub enum CustomWidget<'a> {
    Drop(DropWidget<'a>),
    Delay(DelayWidget<'a>),
    Throttle(ThrottleWidget<'a>),
    Reorder(ReorderWidget<'a>),
    Tamper(TamperWidget<'a>),
    Duplicate(DuplicateWidget<'a>),
    Bandwidth(BandwidthWidget<'a>),
}

macro_rules! impl_widget_traits_for_enum {
    ($enum_name:ident, $($variant:ident),+) => {
        impl<'a> Widget for &mut $enum_name<'a> {
            fn render(mut self, area: Rect, buf: &mut Buffer) {
                match &mut self {
                    $( $enum_name::$variant(ref mut widget) => widget.render(area, buf), )+
                }
            }
        }

        impl<'a> HandleInput for $enum_name<'a> {
            fn handle_input(&mut self, key: KeyEvent) -> bool {
                match self {
                    $( $enum_name::$variant(widget) => widget.handle_input(key), )+
                }
            }
        }

        impl<'a> DisplayName for $enum_name<'a> {
            fn name(&self) -> &str {
                match self {
                    $( $enum_name::$variant(ref widget) => widget.name(), )+
                }
            }
        }

        impl<'a> KeyBindings for $enum_name<'a> {
            fn key_bindings(&self) -> String {
                match self {
                    $( $enum_name::$variant(ref widget) => widget.key_bindings(), )+
                }
            }
        }

        impl<'a> IsActive for $enum_name<'a> {
            fn is_active(&self) -> bool {
                match self {
                    $( $enum_name::$variant(ref widget) => widget.is_active(), )+
                }
            }

            fn set_active(&mut self, state: bool) {
                match self {
                    $( $enum_name::$variant(ref mut widget) => widget.set_active(state), )+
                }
            }
        }
    };
}

impl_widget_traits_for_enum!(
    CustomWidget,
    Drop,
    Delay,
    Throttle,
    Reorder,
    Tamper,
    Duplicate,
    Bandwidth
);