sql_cli/ui/debug/
enhanced_debug_integration.rs

1/// Integration of new debug registry system with existing `toggle_debug_mode`
2/// This file provides a gradual migration path from the old debug system to the new trait-based system
3use crate::ui::enhanced_tui::EnhancedTuiApp;
4
5impl EnhancedTuiApp {
6    /// Generate debug info using the new registry system
7    /// This can be called alongside the existing debug generation to compare outputs
8    pub fn generate_registry_debug_info(&mut self) -> String {
9        // First, register all current providers
10        self.register_debug_providers();
11
12        // Generate the report
13        let mut debug_report = self.debug_registry.generate_debug_report();
14
15        // Add any sections that aren't yet migrated to providers
16        // These will be gradually moved to their own providers
17
18        // Add parser info (not yet migrated)
19        if let Some(buffer) = self.state_container().current_buffer() {
20            let query = buffer.input_manager.get_text();
21            if !query.is_empty() {
22                let parser_info = self.debug_generate_parser_info(&query);
23                debug_report.insert_str(0, &parser_info);
24            }
25        }
26
27        // Add navigation timing (not yet migrated)
28        if !self.navigation_timings.is_empty() {
29            debug_report.push_str("\n========== NAVIGATION TIMING ==========\n");
30            debug_report.push_str(&format!(
31                "Last {} navigation timings:\n",
32                self.navigation_timings.len()
33            ));
34            for timing in &self.navigation_timings {
35                debug_report.push_str(&format!("  {timing}\n"));
36            }
37            // Calculate average
38            if !self.navigation_timings.is_empty() {
39                let total_ms: f64 = self
40                    .navigation_timings
41                    .iter()
42                    .filter_map(|s| self.debug_extract_timing(s))
43                    .sum();
44                let avg_ms = total_ms / self.navigation_timings.len() as f64;
45                debug_report.push_str(&format!("Average navigation time: {avg_ms:.3}ms\n"));
46            }
47        }
48
49        // Add render timing (not yet migrated)
50        if !self.render_timings.is_empty() {
51            debug_report.push_str("\n========== RENDER TIMING ==========\n");
52            debug_report.push_str(&format!(
53                "Last {} render timings:\n",
54                self.render_timings.len()
55            ));
56            for timing in &self.render_timings {
57                debug_report.push_str(&format!("  {timing}\n"));
58            }
59            // Calculate average render time
60            if !self.render_timings.is_empty() {
61                let total_ms: f64 = self
62                    .render_timings
63                    .iter()
64                    .filter_map(|s| self.debug_extract_timing(s))
65                    .sum();
66                let avg_ms = total_ms / self.render_timings.len() as f64;
67                debug_report.push_str(&format!("Average render time: {avg_ms:.3}ms\n"));
68            }
69        }
70
71        // Add trace logs if available
72        debug_report.push_str(&self.debug_generate_trace_logs());
73
74        // Add state change logs
75        debug_report.push_str(&self.debug_generate_state_logs());
76
77        debug_report
78    }
79
80    /// Toggle debug mode with optional use of new registry system
81    /// Set `use_registry` to true to use the new system, false for legacy
82    pub fn toggle_debug_mode_with_registry(&mut self, use_registry: bool) {
83        if use_registry {
84            // Use new registry-based system
85            let should_exit_debug = {
86                if let Some(buffer) = self.state_container().current_buffer() {
87                    buffer.mode == crate::buffer::AppMode::Debug
88                } else {
89                    false
90                }
91            };
92
93            if should_exit_debug {
94                if let Some(buffer) = self.state_container_mut().current_buffer_mut() {
95                    buffer.mode = crate::buffer::AppMode::Command;
96                }
97            } else {
98                // Enter debug mode with registry-generated content
99                if let Some(buffer) = self.state_container_mut().current_buffer_mut() {
100                    buffer.mode = crate::buffer::AppMode::Debug;
101                }
102
103                // Generate debug info using registry
104                let debug_info = self.generate_registry_debug_info();
105
106                // Update the debug widget with new content
107                self.debug_widget.set_content(debug_info);
108            }
109        } else {
110            // Use existing implementation
111            self.toggle_debug_mode();
112        }
113    }
114
115    /// Check if we should use the new debug system
116    /// This can be controlled by config or environment variable in the future
117    pub fn should_use_registry_debug(&self) -> bool {
118        // For now, default to false to maintain stability
119        // Can be changed to true when ready to fully migrate
120        false
121    }
122}