rtlibs-tui 0.1.5

rtools library: ratatui widgets
Documentation
use ratatui::layout::Position;

use crate::widgets::CommanderState;

use super::AppCommanderCommand;

#[derive(Debug)]
pub struct AppCommanderState<T>
where
    T: AppCommanderCommand,
{
    pub(crate) commander: CommanderState,
    pub(crate) commands: Vec<T>,
    pub(crate) selected: Option<String>,
}

impl<T> AppCommanderState<T>
where
    T: AppCommanderCommand,
{
    pub fn new(commands: Vec<T>) -> Self
    {
        let exported = commands
            .iter()
            .map(|c| c.command())
            .collect::<Vec<_>>();

        let commander = CommanderState::new(exported);

        Self {
            commander,
            commands,
            selected: None,
        }
    }

    pub fn selected(&mut self) -> Option<&mut T>
    {
        self.selected
            .clone()
            .and_then(
                |s| {
                    self.commands
                        .iter_mut()
                        .find(
                            |c| {
                                c.command()
                                    .get_name()
                                    .eq(&s)
                            },
                        )
                },
            )
    }

    pub fn clear_selected(&mut self)
    {
        self.selected = None;
    }

    pub fn height(
        &self,
        width: u16,
    ) -> u16
    {
        self.commander
            .height(width)
    }

    pub fn cursor(&self) -> Option<Position>
    {
        self.commander
            .cursor()
    }

    pub fn set_message<S>(
        &mut self,
        message: S,
    ) where
        S: AsRef<str>,
    {
        self.commander
            .set_message(message)
    }

    pub fn clear_message(&mut self)
    {
        self.commander
            .clear_message()
    }
}