use e_ai_summarize::summarizer;
use clap::Parser;
use log::debug;
use rustyline::{Config, DefaultEditor};
use tokio;
#[derive(Parser, Debug)]
#[command(author, version, about)]
struct Args {
file: Option<String>,
#[arg(short = 'i', long = "stdin", conflicts_with = "question")]
interactive: bool,
#[arg(short = 'q', long, conflicts_with = "interactive")]
question: Option<String>,
#[arg(short = 's', long = "streaming", action = clap::ArgAction::SetTrue)]
streaming: bool,
}
#[tokio::main]
async fn main() -> Result<(), Box<dyn std::error::Error>> {
env_logger::Builder::new()
.filter_module("rustyline", log::LevelFilter::Warn)
.init();
let args = Args::parse();
let (_summary, mut session) =
summarizer::summarize_source_session(args.file.as_deref(), args.streaming).await?;
if args.interactive || args.question.is_some() {
if args.interactive {
let config = Config::builder().build();
let mut rl = DefaultEditor::with_config(config)?;
debug!("Interactive mode: enter follow-up questions (empty line to quit):");
loop {
let line = rl.readline("> ")?;
let question = line.trim().to_string();
if question.is_empty() {
break;
}
rl.add_history_entry(&question).ok();
let answer = session.ask(&question).await?;
debug!("Answer: {}\n", answer);
}
} else if let Some(q) = args.question {
let answer = session.ask(&q).await?;
debug!("Answer: {}\n", answer);
}
}
Ok(())
}