kagi-cli 0.1.0

A command-line interface for Kagi.com's APIs
Documentation
use clap::Parser;

use kagi_api::{
    config::RecordReplayMode,
    v0::{universal_summarizer::Subject, FastGPT, SummaryOptions, UniversalSummarizer},
    KagiClient, KagiConfig,
};
use kagi_cli::{render::Render, KagiCommand};

#[tokio::main]
pub async fn main() {
    // FIXME: Replace `.unwrap()` with pretty error handling.
    let config = KagiConfig::from_env().unwrap();
    let args = kagi_cli::Args::parse();
    let reqwest_client = reqwest::Client::new();
    let record_replay_mode = match args.replay {
        true => RecordReplayMode::Replay,
        false => RecordReplayMode::Record,
    };
    let client = KagiClient::with_replay(config, reqwest_client, record_replay_mode).unwrap();

    match args.command.clone() {
        KagiCommand::FastGpt { query, cache } => {
            // FIXME: Replace `.unwrap()` with pretty error handling.
            let answer = client.fastgpt(&query, cache).await.unwrap();
            println!("{}", answer.render(args));
        }

        KagiCommand::Summarize {
            subject,
            summary_type,
            engine,
            target_language,
            cache,
        } => {
            let subject = Subject::url_or_text(subject);
            let cache = if cache { None } else { Some(false) };
            let options = SummaryOptions {
                summary_type,
                engine,
                target_language,
                cache,
            };
            // FIXME: Replace `.unwrap()` with pretty error handling.
            let summary = client.summarize(subject, options).await.unwrap();
            serde_json::to_writer_pretty(std::io::stdout(), &summary).unwrap();
        }

        KagiCommand::Completion { shell } => {
            clap_complete::generate(
                shell,
                &mut <kagi_cli::Args as clap::CommandFactory>::command(),
                "kagi-cli",
                &mut std::io::stdout(),
            );
        }
    };
}