use anyhow::Result;
use clap::Parser;
mod cli;
mod collection_filter;
mod color;
mod commands;
mod format_helpers;
mod output;
mod search_view;
mod state;
use cli::{Cli, Command};
use state::IndexState;
#[tokio::main(flavor = "multi_thread")]
async fn main() {
if let Err(err) = run().await {
eprintln!("error: {err:#}");
std::process::exit(1);
}
}
async fn run() -> Result<()> {
let args = Cli::parse();
rqmd_core::store::path::enable_production_mode();
if args.no_gpu {
unsafe { std::env::set_var("QMD_FORCE_CPU", "1") };
}
let palette = color::Palette::new(args.no_color);
if args.skill {
commands::skill::show(&palette);
return Ok(());
}
let Some(command) = args.command else {
use clap::CommandFactory;
Cli::command()
.error(
clap::error::ErrorKind::MissingSubcommand,
"a subcommand is required",
)
.exit();
};
let mut state = IndexState::new(args.index.as_deref());
let result: Result<()> = match command {
Command::Init => commands::init::run(&palette),
Command::Collection(sub) => commands::collection::run(sub, &mut state, &palette),
Command::Context(sub) => commands::context::run(sub, &mut state, &palette),
Command::Get(a) => commands::get::run(a, &mut state, &palette),
Command::MultiGet(a) => commands::multi_get::run(a, &mut state),
Command::Ls(a) => commands::ls::run(a, &mut state, &palette),
Command::Status => commands::status::run(&mut state, &palette),
Command::Doctor => commands::doctor::run(&mut state, &palette).await,
Command::Update => commands::update::run(&mut state, &palette),
Command::Cleanup => commands::cleanup::run(&mut state, &palette),
Command::Pull(a) => commands::pull::run(a, &mut state, &palette).await,
Command::Embed(a) => commands::embed::run(a, &mut state).await,
Command::Search(a) => commands::search::run(a, &mut state, &palette),
Command::Vsearch(a) => commands::vsearch::run(a, &mut state, &palette).await,
Command::Query(a) => commands::query::run(a, &mut state, &palette).await,
Command::Bench(a) => commands::bench::run(a, &mut state).await,
Command::Mcp(a) => commands::mcp::run(a, &mut state).await,
Command::Skill(sub) => commands::skill::run_skill(sub, &palette),
Command::Skills(sub) => commands::skill::run_skills(sub, &palette),
};
state.close().await;
result
}