use crate::app::{App, FocusBlock}; use crate::components::Component as _; use crate::event::Key; use crate::utils::convert_column_value_to_string; use futures::TryStreamExt; use regex::Regex; use sqlx::Row; pub async fn handler(key: Key, app: &mut App) -> anyhow::Result<()> { match key { Key::Enter => { let re = Regex::new(r"select .+ from ([^ ]+).*").unwrap(); match re.captures(app.query.input.as_str()) { Some(caps) => { let mut rows = sqlx::query(app.query.input.as_str()).fetch(app.pool.as_ref().unwrap()); let headers = sqlx::query(format!("desc `{}`", caps.get(1).unwrap().as_str()).as_str()) .fetch_all(app.pool.as_ref().unwrap()) .await? .iter() .map(|table| table.get(0)) .collect::>(); let mut records = vec![]; while let Some(row) = rows.try_next().await? { records.push( row.columns() .iter() .map(|col| convert_column_value_to_string(&row, col)) .collect::>(), ) } app.record_table.reset(headers, records); } None => { sqlx::query(app.query.input.as_str()) .execute(app.pool.as_ref().unwrap()) .await?; } } } Key::Esc => app.focus_block = FocusBlock::DabataseList, key => app.query.event(key)?, } Ok(()) }