mod config;
pub(crate) mod connection;
pub(crate) mod connection_schema;
mod connection_schema_cache;
mod contracts;
mod output;
mod query;
mod query_input;
mod state;
use crate::{cli::Command, config::runtime::RuntimeConfig, render::RenderFormat};
use saya_agent::ApprovalPolicy;
use saya_store::SqliteStateStore;
pub use contracts::run_contracts;
pub use output::{capture_output_start, capture_output_take};
pub(crate) use contracts::unobserved_fingerprint;
pub(crate) use contracts::contract_view;
pub(crate) use contracts::cached_schema_availability;
pub async fn run(
command: Command,
runtime: &RuntimeConfig,
format: RenderFormat,
approval: ApprovalPolicy,
can_prompt: bool,
included_profiles: Vec<String>,
) -> Result<i32, Box<dyn std::error::Error>> {
let state = SqliteStateStore::new(crate::state_path::state_db_path());
match command {
Command::Config { command } => config::run(command, runtime, format),
Command::Connection { command } => {
connection::run(command, runtime, format, can_prompt, &state).await
}
Command::Ask { prompt, file } => {
query::ask(
prompt,
file,
runtime,
format,
approval,
can_prompt,
included_profiles,
&state,
)
.await
}
Command::Query { sql, file } => {
query::run(sql, file, runtime, format, can_prompt, &state).await
}
Command::Contracts { command } => {
contracts::run_contracts(command, runtime, format, &state).await
}
Command::Completions { .. } => unreachable!("handled in dispatch"),
}
}
pub(crate) fn run_config_init(format: RenderFormat) -> Result<i32, Box<dyn std::error::Error>> {
config::run_init(format)
}