sql_cli/ui/behaviors/
status_behavior.rs1use anyhow::Result;
5
6pub trait StatusBehavior {
8 fn buffer_mut(&mut self) -> &mut dyn crate::buffer::BufferAPI;
10
11 fn set_status(&mut self, message: impl Into<String>) {
13 let msg = message.into();
14 tracing::debug!("Status: {}", msg);
15 self.buffer_mut().set_status_message(msg);
16 }
17
18 fn set_error(&mut self, context: &str, error: impl std::fmt::Display) {
20 let msg = format!("{}: {}", context, error);
21 tracing::error!("Error status: {}", msg);
22 self.buffer_mut().set_status_message(msg);
23 }
24
25 fn set_success(&mut self, message: impl Into<String>) {
27 let msg = message.into();
28 tracing::info!("Success: {}", msg);
29 self.buffer_mut().set_status_message(msg);
30 }
31
32 fn clear_status(&mut self) {
34 self.buffer_mut().set_status_message(String::new());
35 }
36
37 fn set_temporary_status(&mut self, message: impl Into<String>, _duration_ms: u64) {
39 self.set_status(message);
41 }
42
43 fn set_query_status(&mut self, rows: usize, columns: usize, elapsed_ms: u64) {
45 self.set_status(format!(
46 "Query executed: {} rows, {} columns ({} ms)",
47 rows, columns, elapsed_ms
48 ));
49 }
50
51 fn set_search_status(&mut self, pattern: &str, current: usize, total: usize) {
53 if total == 0 {
54 self.set_status(format!("/{} - no matches", pattern));
55 } else {
56 self.set_status(format!("Match {}/{} for '{}'", current, total, pattern));
57 }
58 }
59
60 fn set_filter_status(&mut self, active: bool, matches: usize) {
62 if active {
63 self.set_status(format!("Filter active: {} matches", matches));
64 } else {
65 self.set_status("Filter cleared");
66 }
67 }
68
69 fn set_column_status(&mut self, operation: &str, column_name: &str) {
71 self.set_status(format!("{}: {}", operation, column_name));
72 }
73
74 fn set_navigation_status(&mut self, description: &str) {
76 self.set_status(description);
77 }
78
79 fn set_mode_status(&mut self, new_mode: &str) {
81 self.set_status(format!("{} mode", new_mode));
82 }
83
84 fn set_yank_status(&mut self, target: &str, size: usize) {
86 self.set_status(format!("Yanked {} ({} items)", target, size));
87 }
88
89 fn set_chord_status(&mut self, chord: &str, completions: &[String]) {
91 if completions.is_empty() {
92 self.set_status(format!("Chord: {} (no completions)", chord));
93 } else {
94 let completion_str = completions.join(", ");
95 self.set_status(format!("Chord: {} - available: {}", chord, completion_str));
96 }
97 }
98
99 fn set_history_status(&mut self, matches: usize) {
101 self.set_status(format!("History search: {} matches", matches));
102 }
103
104 fn handle_result_status<T>(
106 &mut self,
107 result: Result<T>,
108 success_msg: &str,
109 error_context: &str,
110 ) -> Option<T> {
111 match result {
112 Ok(value) => {
113 self.set_success(success_msg);
114 Some(value)
115 }
116 Err(e) => {
117 self.set_error(error_context, e);
118 None
119 }
120 }
121 }
122}