sql_cli/ui/input/
input_handlers.rs1use crate::app_state_container::AppStateContainer;
5use crate::buffer::{AppMode, BufferAPI, BufferManager};
6use crate::ui::state::shadow_state::ShadowStateManager;
7use crate::widgets::help_widget::HelpAction;
8use crate::widgets::stats_widget::StatsAction;
9use anyhow::Result;
10use crossterm::event::{KeyCode, KeyEvent, KeyModifiers};
11use std::cell::RefCell;
12
13pub struct DebugInputContext<'a> {
16 pub buffer_manager: &'a mut BufferManager,
17 pub debug_widget: &'a mut crate::widgets::debug_widget::DebugWidget,
18 pub shadow_state: &'a RefCell<ShadowStateManager>,
19}
20
21pub struct HelpInputContext<'a> {
23 pub buffer_manager: &'a mut BufferManager,
24 pub help_widget: &'a mut crate::widgets::help_widget::HelpWidget,
25 pub state_container: &'a AppStateContainer,
26 pub shadow_state: &'a RefCell<ShadowStateManager>,
27}
28
29pub struct StatsInputContext<'a> {
31 pub buffer_manager: &'a mut BufferManager,
32 pub stats_widget: &'a mut crate::widgets::stats_widget::StatsWidget,
33 pub shadow_state: &'a RefCell<ShadowStateManager>,
34}
35
36pub fn handle_debug_input(ctx: &mut DebugInputContext, key: KeyEvent) -> Result<bool> {
38 match key.code {
40 KeyCode::Char('c') if key.modifiers.contains(KeyModifiers::CONTROL) => {
41 return Ok(true);
43 }
44 KeyCode::Char('t') if key.modifiers.contains(KeyModifiers::CONTROL) => {
45 if let Some(buffer) = ctx.buffer_manager.current_mut() {
49 buffer.set_status_message(
50 "Test case yank not yet implemented in extracted handler".to_string(),
51 );
52 }
53 return Ok(false);
54 }
55 KeyCode::Char('y') if key.modifiers.contains(KeyModifiers::SHIFT) => {
56 if let Some(buffer) = ctx.buffer_manager.current_mut() {
60 buffer.set_status_message(
61 "Debug yank not yet implemented in extracted handler".to_string(),
62 );
63 }
64 return Ok(false);
65 }
66 _ => {}
67 }
68
69 if ctx.debug_widget.handle_key(key) {
71 if let Some(buffer) = ctx.buffer_manager.current_mut() {
73 ctx.shadow_state
74 .borrow_mut()
75 .set_mode(AppMode::Command, buffer, "debug_exit");
76 }
77 }
78
79 Ok(false)
80}
81
82pub fn handle_pretty_query_input(ctx: &mut DebugInputContext, key: KeyEvent) -> Result<bool> {
84 if key.code == KeyCode::Char('c') && key.modifiers.contains(KeyModifiers::CONTROL) {
85 return Ok(true);
86 }
87
88 if ctx.debug_widget.handle_key(key) {
90 if let Some(buffer) = ctx.buffer_manager.current_mut() {
92 ctx.shadow_state
93 .borrow_mut()
94 .set_mode(AppMode::Command, buffer, "pretty_query_exit");
95 }
96 }
97
98 Ok(false)
99}
100
101pub fn handle_cache_list_input(ctx: &mut DebugInputContext, key: KeyEvent) -> Result<bool> {
103 match key.code {
104 KeyCode::Char('c') if key.modifiers.contains(KeyModifiers::CONTROL) => return Ok(true),
105 KeyCode::Esc | KeyCode::Enter | KeyCode::Char('q') => {
106 if let Some(buffer) = ctx.buffer_manager.current_mut() {
107 ctx.shadow_state
108 .borrow_mut()
109 .set_mode(AppMode::Command, buffer, "cache_list_exit");
110 }
111 }
112 _ => {}
113 }
114 Ok(false)
115}
116
117pub fn handle_help_input(ctx: &mut HelpInputContext, key: KeyEvent) -> Result<bool> {
119 match ctx.help_widget.handle_key(key) {
121 HelpAction::Exit => {
122 exit_help(ctx);
123 }
124 HelpAction::ShowDebug => {
125 }
127 _ => {
128 }
130 }
131 Ok(false)
132}
133
134fn exit_help(ctx: &mut HelpInputContext) {
136 ctx.help_widget.on_exit();
137 ctx.state_container.set_help_visible(false);
138 let mode = if let Some(buffer) = ctx.buffer_manager.current() {
140 if buffer.has_dataview() {
141 AppMode::Results
142 } else {
143 AppMode::Command
144 }
145 } else {
146 AppMode::Command
147 };
148 if let Some(buffer) = ctx.buffer_manager.current_mut() {
149 ctx.shadow_state
150 .borrow_mut()
151 .set_mode(mode, buffer, "help_exit");
152 }
153}
154
155pub fn handle_column_stats_input(ctx: &mut StatsInputContext, key: KeyEvent) -> Result<bool> {
157 match ctx.stats_widget.handle_key(key) {
158 StatsAction::Quit => return Ok(true),
159 StatsAction::Close => {
160 if let Some(buffer) = ctx.buffer_manager.current_mut() {
161 buffer.set_column_stats(None);
162 ctx.shadow_state
163 .borrow_mut()
164 .set_mode(AppMode::Results, buffer, "stats_close");
165 }
166 }
167 StatsAction::Continue | StatsAction::PassThrough => {}
168 }
169 Ok(false)
170}