refactor: add modal/validation utils and partial App encapsulation

Quick wins refactoring (Variant 1):
- Created src/utils/modal_handler.rs (120+ lines)
  - 4 functions for modal handling (close, confirm, yes/no)
  - ModalAction enum for type-safe processing
  - English and Russian keyboard layout support
  - 4 unit tests
- Created src/utils/validation.rs (180+ lines)
  - 7 validation functions (empty, length, IDs, etc)
  - Covers all common validation patterns
  - 7 unit tests
- Partial App encapsulation:
  - Made config field private (readonly via app.config())
  - Added 30+ getter/setter methods
  - Updated ui/messages.rs to use config()
- Updated documentation:
  - REFACTORING_OPPORTUNITIES.md: #1 Complete, #5 Partial
  - CONTEXT.md: Added quick wins section

Tests: 563 passed, 0 failed

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
This commit is contained in:
Mikhail Kilin
2026-02-01 23:55:49 +03:00
parent e690acfb09
commit dff0897da4
7 changed files with 631 additions and 19 deletions

View File

@@ -1,7 +1,7 @@
# Возможности для рефакторинга
> Результаты аудита кодовой базы от 2026-02-01
> Статус: В работе (1/10 категорий)
> Статус: В работе (2/10 категорий завершены)
## Оглавление
@@ -21,7 +21,7 @@
## 1. Дублирование кода
**Приоритет:** 🔴 Высокий
**Статус:**Частично выполнено
**Статус:**ЗАВЕРШЕНО! (2026-02-01)
**Объем:** 15-20% кодовой базы
### Проблемы
@@ -46,8 +46,17 @@
- Создан `src/utils/retry.rs` с двумя функциями: `with_timeout()` и `with_timeout_msg()`
- Заменены 18+ использований `tokio::time::timeout` в `src/input/main_input.rs`
- Код стал чище и короче (убрано вложенное Ok/Err матчинг)
- [ ] Создать `modal_handler.rs` с общей логикой модальных окон
- [ ] Создать `validation.rs` с переиспользуемыми валидаторами
- [x] Создать `modal_handler.rs` с общей логикой модальных окон - **Выполнено** (2026-02-01)
- Создан `src/utils/modal_handler.rs` (120+ строк)
- 4 функции: `handle_modal_key()`, `should_close_modal()`, `should_confirm_modal()`, `handle_yes_no()`
- Enum `ModalAction` для type-safe обработки
- Поддержка английской и русской раскладки (y/д, n/т)
- 4 unit теста (все проходят)
- [x] Создать `validation.rs` с переиспользуемыми валидаторами - **Выполнено** (2026-02-01)
- Создан `src/utils/validation.rs` (180+ строк)
- 7 функций валидации: `is_non_empty()`, `is_within_length()`, `is_valid_chat_id()`, `is_valid_message_id()`, `is_valid_user_id()`, `has_items()`, `validate_text_input()`
- Покрывает все основные паттерны валидации
- 7 unit тестов (все проходят)
### Файлы
@@ -208,7 +217,7 @@ if let Some(chat_id) = app.selected_chat {
## 5. Плохая инкапсуляция
**Приоритет:** 🔴 Высокий
**Статус:** Не начато
**Статус:** ✅ Частично выполнено (2026-02-01)
**Объем:** Вся структура `App`
### Проблемы
@@ -238,16 +247,20 @@ if let Some(chat_id) = app.selected_chat {
### Решение
- [ ] Сделать все поля приватными
- [ ] Добавить getter методы где нужно
- [ ] Добавить setter методы с валидацией
- [x] Сделать критичные поля приватными - **Частично выполнено** (2026-02-01)
- ✅ `config` сделан приватным (readonly через getter `app.config()`)
- ✅ Добавлены 30+ методов-геттеров и сеттеров для всех полей
- ⏳ Остальные поля оставлены pub для совместимости (требуется массовый рефакторинг)
- [x] Добавить getter методы где нужно - **Выполнено**
- 30+ методов: `phone_input()`, `set_phone_input()`, `screen()`, `set_screen()`, `is_loading()`, и т.д.
- [ ] Полная инкапсуляция всех полей (требует обновления 170+ мест в коде)
- [ ] Создать методы для операций (вместо прямого доступа)
```rust
// Вместо app.selected_chat = Some(chat_id)
app.select_chat(chat_id);
app.select_chat(chat_id); // Уже есть!
// Вместо app.chats.push(new_chat)
app.add_chat(new_chat);
app.add_chat(new_chat); // TODO
```
### Файлы