use super::super::application::SecondSqlDecision;
use super::super::dispatch::Dispatch;
use super::super::session_save::queue_session_save;
use super::super::sql_task;
use super::super::transcript::BlockKind;
use super::super::types::App;
use crate::config::runtime::RuntimeConfig;
use crate::interactive::compact_task;
use crate::interactive::session_runtime::SessionRuntime;
use crate::interactive::session_state::SessionState;
use crate::render::RenderFormat;
use saya_store::FsSessionStore;
use std::sync::Arc;
pub(crate) fn tick_pending(
app: &mut App,
state: &mut SessionState,
runtime: &RuntimeConfig,
store: &FsSessionStore,
format: RenderFormat,
session: &mut SessionRuntime,
) {
if !app.is_busy()
&& let Some(line) = app.pending.take()
{
let id_before = state.id.clone();
let outcome = super::super::dispatch::dispatch(
&line,
&mut app.transcript,
&app.profiles,
state,
runtime,
store,
&app.state_db,
format,
&mut app.last_query,
session,
);
match outcome {
Dispatch::Quit => {
if app.try_quit() {
app.should_quit = true;
}
}
Dispatch::Handled => app.reload_at_refs(state),
Dispatch::Agent(prompt) => {
app.start_agent(prompt, state, session);
}
Dispatch::OpenSessionPicker => app.open_session_picker(store),
Dispatch::Compact => {
compact_task::start(&mut *app, state);
}
Dispatch::SetColumns(arg) => app.set_visible_columns(arg),
Dispatch::RunPanel {
goal,
allow,
budget,
} => app.start_run_panel(goal, allow, budget, format, state),
Dispatch::SqlTask(task) => {
match app.admit_second_sql() {
SecondSqlDecision::Start => {
let started = std::time::Instant::now();
app.sql_task = Some((
sql_task::spawn(Arc::clone(&app.runtime), task.clone()),
task,
started,
));
app.request.started = Some(started);
app.request.activity = Some("query".into());
}
SecondSqlDecision::Reject(message) => {
app.transcript.push(BlockKind::System, message)
}
}
}
}
if state.id != id_before {
app.session = session.universe();
app.session.seed_tasks(state.task_list.clone());
}
queue_session_save(&mut *app, store, state);
}
}