use std::env;
use std::time::Duration;
use clap::Parser;
use colored::Colorize;
use indicatif::{ProgressBar, ProgressStyle};
use log_genius::cli::Cli;
use log_genius::error::{Result, AppError};
use log_genius::{input, openai};
#[tokio::main]
async fn main() {
dotenvy::dotenv().ok();
if let Err(e) = run().await {
eprintln!("Error: {}", e);
std::process::exit(1);
}
}
async fn run() -> Result<()> {
dotenvy::dotenv().ok();
let cli = Cli::parse();
let log_data = input::read_input(cli.file)?;
if log_data.trim().is_empty() {
eprintln!("{}", "Warning: Input is empty. Nothing to analyze.".yellow());
return Ok(());
}
let api_key = env::var("OPENAI_API_KEY").map_err(|_| AppError::ApiKeyMissing)?;
let spinner = ProgressBar::new_spinner();
spinner.set_style(
ProgressStyle::default_spinner()
.tick_strings(&["⠋", "⠙", "⠹", "⠸", "⠼", "⠴", "⠦", "⠧", "⠇", "⠏"])
.template("{spinner:.cyan} {msg}")
.unwrap(),
);
spinner.set_message("🤖 AI is analyzing your log...");
spinner.enable_steady_tick(Duration::from_millis(100));
let analysis_result = openai::analyze_log(&api_key, &log_data).await;
spinner.finish_and_clear();
match analysis_result {
Ok(content) => {
println!("---");
for line in content.lines() {
if line.starts_with("[Summary]") {
println!("{}", line.bright_yellow().bold());
} else if line.starts_with("[Potential Causes]") {
println!("{}", line.bright_magenta().bold());
} else if line.starts_with("[Suggested Solutions]") {
println!("{}", line.bright_cyan().bold());
} else if line.trim().starts_with('#') {
println!("{}", line.dimmed());
} else {
println!("{}", line);
}
}
println!("---");
}
Err(e) => {
return Err(e);
}
}
Ok(())
}