refactor: complete nesting simplification with let-else guards

Применены дополнительные упрощения:
- handle_escape_key: преобразован в early returns
- handle_message_selection: применены let-else guards для всех веток
  - Блоки 'd', 'y', 'e' теперь с явными guards

Результат Phase 4:
- Уменьшена вложенность во всех извлечённых функциях
- Применены паттерны: early returns, let-else guards, вспомогательные функции
- Код стал максимально линейным и читаемым
- Глубина вложенности: 6+ → 2-3 уровня

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
This commit is contained in:
Mikhail Kilin
2026-02-03 20:35:20 +03:00
parent 67fd7506b3
commit 9d9232f74f

View File

@@ -181,14 +181,15 @@ async fn handle_message_selection<T: TdClientTrait>(app: &mut App<T>, key: KeyEv
} }
KeyCode::Char('d') | KeyCode::Char('в') | KeyCode::Delete => { KeyCode::Char('d') | KeyCode::Char('в') | KeyCode::Delete => {
// Показать модалку подтверждения удаления // Показать модалку подтверждения удаления
if let Some(msg) = app.get_selected_message() { let Some(msg) = app.get_selected_message() else {
let can_delete = return;
msg.can_be_deleted_only_for_self() || msg.can_be_deleted_for_all_users(); };
if can_delete { let can_delete =
app.chat_state = crate::app::ChatState::DeleteConfirmation { msg.can_be_deleted_only_for_self() || msg.can_be_deleted_for_all_users();
message_id: msg.id(), if can_delete {
}; app.chat_state = crate::app::ChatState::DeleteConfirmation {
} message_id: msg.id(),
};
} }
} }
KeyCode::Char('r') | KeyCode::Char('к') => { KeyCode::Char('r') | KeyCode::Char('к') => {
@@ -201,55 +202,57 @@ async fn handle_message_selection<T: TdClientTrait>(app: &mut App<T>, key: KeyEv
} }
KeyCode::Char('y') | KeyCode::Char('н') => { KeyCode::Char('y') | KeyCode::Char('н') => {
// Копировать сообщение // Копировать сообщение
if let Some(msg) = app.get_selected_message() { let Some(msg) = app.get_selected_message() else {
let text = format_message_for_clipboard(&msg); return;
match copy_to_clipboard(&text) { };
Ok(_) => { let text = format_message_for_clipboard(&msg);
app.status_message = Some("Сообщение скопировано".to_string()); match copy_to_clipboard(&text) {
} Ok(_) => {
Err(e) => { app.status_message = Some("Сообщение скопировано".to_string());
app.error_message = Some(format!("Ошибка копирования: {}", e)); }
} Err(e) => {
app.error_message = Some(format!("Ошибка копирования: {}", e));
} }
} }
} }
KeyCode::Char('e') | KeyCode::Char('у') => { KeyCode::Char('e') | KeyCode::Char('у') => {
// Открыть emoji picker для добавления реакции // Открыть emoji picker для добавления реакции
if let Some(msg) = app.get_selected_message() { let Some(msg) = app.get_selected_message() else {
let chat_id = app.selected_chat_id.unwrap(); return;
let message_id = msg.id(); };
let chat_id = app.selected_chat_id.unwrap();
let message_id = msg.id();
app.status_message = Some("Загрузка реакций...".to_string()); app.status_message = Some("Загрузка реакций...".to_string());
app.needs_redraw = true; app.needs_redraw = true;
// Запрашиваем доступные реакции // Запрашиваем доступные реакции
match with_timeout_msg( match with_timeout_msg(
Duration::from_secs(5), Duration::from_secs(5),
app.td_client app.td_client
.get_message_available_reactions(chat_id, message_id), .get_message_available_reactions(chat_id, message_id),
"Таймаут загрузки реакций", "Таймаут загрузки реакций",
) )
.await .await
{ {
Ok(reactions) => { Ok(reactions) => {
let reactions: Vec<String> = reactions; let reactions: Vec<String> = reactions;
if reactions.is_empty() { if reactions.is_empty() {
app.error_message = app.error_message =
Some("Реакции недоступны для этого сообщения".to_string()); Some("Реакции недоступны для этого сообщения".to_string());
app.status_message = None; app.status_message = None;
app.needs_redraw = true; app.needs_redraw = true;
} else { } else {
app.enter_reaction_picker_mode(message_id.as_i64(), reactions); app.enter_reaction_picker_mode(message_id.as_i64(), reactions);
app.status_message = None;
app.needs_redraw = true;
}
}
Err(e) => {
app.error_message = Some(e);
app.status_message = None; app.status_message = None;
app.needs_redraw = true; app.needs_redraw = true;
} }
} }
Err(e) => {
app.error_message = Some(e);
app.status_message = None;
app.needs_redraw = true;
}
} }
} }
_ => {} _ => {}
@@ -264,28 +267,39 @@ async fn handle_message_selection<T: TdClientTrait>(app: &mut App<T>, key: KeyEv
/// - В режиме ответа: отменить ответ /// - В режиме ответа: отменить ответ
/// - В открытом чате: сохранить черновик и закрыть чат /// - В открытом чате: сохранить черновик и закрыть чат
async fn handle_escape_key<T: TdClientTrait>(app: &mut App<T>) { async fn handle_escape_key<T: TdClientTrait>(app: &mut App<T>) {
// Early return для режима выбора сообщения
if app.is_selecting_message() { if app.is_selecting_message() {
// Отменить выбор сообщения
app.chat_state = crate::app::ChatState::Normal; app.chat_state = crate::app::ChatState::Normal;
} else if app.is_editing() { return;
// Отменить редактирование
app.cancel_editing();
} else if app.is_replying() {
// Отменить режим ответа
app.cancel_reply();
} else if app.selected_chat_id.is_some() {
// Сохраняем черновик если есть текст в инпуте
if let Some(chat_id) = app.selected_chat_id {
if !app.message_input.is_empty() && !app.is_editing() && !app.is_replying() {
let draft_text = app.message_input.clone();
let _ = app.td_client.set_draft_message(chat_id, draft_text).await;
} else if app.message_input.is_empty() {
// Очищаем черновик если инпут пустой
let _ = app.td_client.set_draft_message(chat_id, String::new()).await;
}
}
app.close_chat();
} }
// Early return для режима редактирования
if app.is_editing() {
app.cancel_editing();
return;
}
// Early return для режима ответа
if app.is_replying() {
app.cancel_reply();
return;
}
// Закрытие чата с сохранением черновика
let Some(chat_id) = app.selected_chat_id else {
return;
};
// Сохраняем черновик если есть текст в инпуте
if !app.message_input.is_empty() && !app.is_editing() && !app.is_replying() {
let draft_text = app.message_input.clone();
let _ = app.td_client.set_draft_message(chat_id, draft_text).await;
} else if app.message_input.is_empty() {
// Очищаем черновик если инпут пустой
let _ = app.td_client.set_draft_message(chat_id, String::new()).await;
}
app.close_chat();
} }
/// Редактирование существующего сообщения /// Редактирование существующего сообщения