//! Modal dialog utilities //! //! Переиспользуемая логика для обработки модальных окон (диалогов). use crossterm::event::KeyCode; /// Обрабатывает клавиши для подтверждения Yes/No. /// /// Поддерживает: /// - `y` / `Y` / `д` / `Д` - да (confirm) /// - `n` / `N` / `т` / `Т` - нет (close) /// - `Enter` - подтвердить (confirm) /// - `Esc` - отменить (close) /// /// # Arguments /// /// * `key_code` - код нажатой клавиши /// /// # Returns /// /// * `Some(true)` - подтверждение (yes/Enter) /// * `Some(false)` - отмена (no/Escape) /// * `None` - другая клавиша (продолжить ввод) /// /// # Examples /// /// ``` /// use crossterm::event::KeyCode; /// use tele_tui::utils::modal_handler::handle_yes_no; /// /// assert_eq!(handle_yes_no(KeyCode::Char('y')), Some(true)); /// assert_eq!(handle_yes_no(KeyCode::Char('Y')), Some(true)); /// assert_eq!(handle_yes_no(KeyCode::Char('н')), Some(true)); // русская 'y' /// assert_eq!(handle_yes_no(KeyCode::Enter), Some(true)); /// /// assert_eq!(handle_yes_no(KeyCode::Char('n')), Some(false)); /// assert_eq!(handle_yes_no(KeyCode::Char('т')), Some(false)); // русская 'n' /// assert_eq!(handle_yes_no(KeyCode::Esc), Some(false)); /// /// assert_eq!(handle_yes_no(KeyCode::Char('a')), None); /// ``` pub fn handle_yes_no(key_code: KeyCode) -> Option { match key_code { // Yes - подтверждение (английская и русская раскладка) KeyCode::Char('y') | KeyCode::Char('Y') | KeyCode::Char('н') | KeyCode::Char('Н') => { Some(true) } KeyCode::Enter => Some(true), // No - отмена (английская и русская раскладка) KeyCode::Char('n') | KeyCode::Char('N') | KeyCode::Char('т') | KeyCode::Char('Т') => { Some(false) } KeyCode::Esc => Some(false), // Другие клавиши - продолжить _ => None, } } #[cfg(test)] mod tests { use super::*; #[test] fn test_handle_yes_no() { // Yes variants assert_eq!(handle_yes_no(KeyCode::Char('y')), Some(true)); assert_eq!(handle_yes_no(KeyCode::Char('Y')), Some(true)); assert_eq!(handle_yes_no(KeyCode::Char('н')), Some(true)); // Russian assert_eq!(handle_yes_no(KeyCode::Char('Н')), Some(true)); // Russian assert_eq!(handle_yes_no(KeyCode::Enter), Some(true)); // No variants assert_eq!(handle_yes_no(KeyCode::Char('n')), Some(false)); assert_eq!(handle_yes_no(KeyCode::Char('N')), Some(false)); assert_eq!(handle_yes_no(KeyCode::Char('т')), Some(false)); // Russian assert_eq!(handle_yes_no(KeyCode::Char('Т')), Some(false)); // Russian assert_eq!(handle_yes_no(KeyCode::Esc), Some(false)); // Other keys assert_eq!(handle_yes_no(KeyCode::Char('a')), None); assert_eq!(handle_yes_no(KeyCode::Up), None); assert_eq!(handle_yes_no(KeyCode::Char(' ')), None); } }