rtlibs-tui 0.1.4

rtools library: ratatui widgets
Documentation
use crossterm::event::KeyCode;
use crossterm::event::KeyModifiers;

use crate::widgets::KeyEventHandler;
use crate::Result;

use super::InputNumberState;

pub enum InputNumberEvent
{
    NotHandled,
    Handled,
    Change(
        String,
        Option<u32>,
    ),
    Confirm(
        String,
        Option<u32>,
    ),
    Cancel(),
}

impl KeyEventHandler<'_, InputNumberEvent> for InputNumberState
{
    fn handle_key_event(
        &mut self,
        code: KeyCode,
        _modifiers: KeyModifiers,
    ) -> Result<InputNumberEvent>
    {
        let value = self
            .input()
            .filter(
                |v| {
                    self.max_value
                        .map(|max| *v <= max)
                        .unwrap_or(true)
                },
            )
            .filter(
                |v| {
                    self.min_value
                        .map(|min| *v >= min)
                        .unwrap_or(true)
                },
            );

        let response = match code
        {
            KeyCode::Esc =>
            {
                if self.clear_on_cancel
                {
                    self.clear();
                }
                InputNumberEvent::Cancel()
            }
            KeyCode::Char(to_insert) =>
            {
                if to_insert.is_ascii_digit()
                {
                    self.enter_char(to_insert);
                    InputNumberEvent::Change(
                        self.input
                            .clone(),
                        value,
                    )
                }
                else
                {
                    InputNumberEvent::NotHandled
                }
            }
            KeyCode::Delete =>
            {
                self.supp_char();
                InputNumberEvent::Change(
                    self.input
                        .clone(),
                    value,
                )
            }
            KeyCode::Backspace =>
            {
                self.delete_char();
                InputNumberEvent::Change(
                    self.input
                        .clone(),
                    value,
                )
            }
            KeyCode::Left =>
            {
                self.move_cursor_left();
                InputNumberEvent::Handled
            }
            KeyCode::Right =>
            {
                self.move_cursor_right();
                InputNumberEvent::Handled
            }
            KeyCode::Home =>
            {
                self.move_cursor_start();
                InputNumberEvent::Handled
            }
            KeyCode::End =>
            {
                self.move_cursor_end();
                InputNumberEvent::Handled
            }
            KeyCode::Enter =>
            {
                let result = InputNumberEvent::Confirm(
                    self.input
                        .clone(),
                    value,
                );
                if self.clear_on_confirm
                {
                    self.clear();
                }
                result
            }
            _ => InputNumberEvent::NotHandled,
        };

        Ok(response)
    }
}