refactor: implement trait-based DI for TdClient and fix stack overflow
Implement complete trait-based dependency injection pattern for TdClient to enable testing with FakeTdClient mock. Fix critical stack overflow bugs caused by infinite recursion in trait implementations. Breaking Changes: - App is now generic: App<T: TdClientTrait = TdClient> - All UI and input handlers are generic over TdClientTrait - TdClient methods now accessed through trait interface New Files: - src/tdlib/trait.rs: TdClientTrait definition with 40+ methods - src/tdlib/client_impl.rs: TdClientTrait impl for TdClient - tests/helpers/fake_tdclient_impl.rs: TdClientTrait impl for FakeTdClient Critical Fixes: - Fix stack overflow in send_message, edit_message, delete_messages - Fix stack overflow in forward_messages, current_chat_messages - Fix stack overflow in current_pinned_message - All methods now call message_manager directly to avoid recursion Testing: - FakeTdClient supports configurable auth_state for auth screen tests - Added pinned message support in FakeTdClient - All 196+ tests passing (188 tests + 8 benchmarks) Dependencies: - Added async-trait = "0.1" Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
This commit is contained in:
@@ -1,5 +1,6 @@
|
||||
use super::{chat_list, footer, messages};
|
||||
use crate::app::App;
|
||||
use crate::tdlib::TdClientTrait;
|
||||
use ratatui::{
|
||||
layout::{Constraint, Direction, Layout, Rect},
|
||||
style::{Color, Modifier, Style},
|
||||
@@ -11,7 +12,7 @@ use ratatui::{
|
||||
/// Порог ширины для компактного режима (одна панель)
|
||||
const COMPACT_WIDTH: u16 = 80;
|
||||
|
||||
pub fn render(f: &mut Frame, app: &mut App) {
|
||||
pub fn render<T: TdClientTrait>(f: &mut Frame, app: &mut App<T>) {
|
||||
let area = f.area();
|
||||
let is_compact = area.width < COMPACT_WIDTH;
|
||||
|
||||
@@ -52,7 +53,7 @@ pub fn render(f: &mut Frame, app: &mut App) {
|
||||
footer::render(f, chunks[2], app);
|
||||
}
|
||||
|
||||
fn render_folders(f: &mut Frame, area: Rect, app: &App) {
|
||||
fn render_folders<T: TdClientTrait>(f: &mut Frame, area: Rect, app: &App<T>) {
|
||||
let mut spans = vec![];
|
||||
|
||||
// "All" всегда первая (клавиша 1)
|
||||
|
||||
Reference in New Issue
Block a user