use anyhow::Result;
pub trait StatusBehavior {
fn buffer_mut(&mut self) -> &mut dyn crate::buffer::BufferAPI;
fn set_status(&mut self, message: impl Into<String>) {
let msg = message.into();
tracing::debug!("Status: {}", msg);
self.buffer_mut().set_status_message(msg);
}
fn set_error(&mut self, context: &str, error: impl std::fmt::Display) {
let msg = format!("{context}: {error}");
tracing::error!("Error status: {}", msg);
self.buffer_mut().set_status_message(msg);
}
fn set_success(&mut self, message: impl Into<String>) {
let msg = message.into();
tracing::info!("Success: {}", msg);
self.buffer_mut().set_status_message(msg);
}
fn clear_status(&mut self) {
self.buffer_mut().set_status_message(String::new());
}
fn set_temporary_status(&mut self, message: impl Into<String>, _duration_ms: u64) {
self.set_status(message);
}
fn set_query_status(&mut self, rows: usize, columns: usize, elapsed_ms: u64) {
self.set_status(format!(
"Query executed: {rows} rows, {columns} columns ({elapsed_ms} ms)"
));
}
fn set_search_status(&mut self, pattern: &str, current: usize, total: usize) {
if total == 0 {
self.set_status(format!("/{pattern} - no matches"));
} else {
self.set_status(format!("Match {current}/{total} for '{pattern}'"));
}
}
fn set_filter_status(&mut self, active: bool, matches: usize) {
if active {
self.set_status(format!("Filter active: {matches} matches"));
} else {
self.set_status("Filter cleared");
}
}
fn set_column_status(&mut self, operation: &str, column_name: &str) {
self.set_status(format!("{operation}: {column_name}"));
}
fn set_navigation_status(&mut self, description: &str) {
self.set_status(description);
}
fn set_mode_status(&mut self, new_mode: &str) {
self.set_status(format!("{new_mode} mode"));
}
fn set_yank_status(&mut self, target: &str, size: usize) {
self.set_status(format!("Yanked {target} ({size} items)"));
}
fn set_chord_status(&mut self, chord: &str, completions: &[String]) {
if completions.is_empty() {
self.set_status(format!("Chord: {chord} (no completions)"));
} else {
let completion_str = completions.join(", ");
self.set_status(format!("Chord: {chord} - available: {completion_str}"));
}
}
fn set_history_status(&mut self, matches: usize) {
self.set_status(format!("History search: {matches} matches"));
}
fn handle_result_status<T>(
&mut self,
result: Result<T>,
success_msg: &str,
error_context: &str,
) -> Option<T> {
match result {
Ok(value) => {
self.set_success(success_msg);
Some(value)
}
Err(e) => {
self.set_error(error_context, e);
None
}
}
}
}