log-genius 0.1.0

An AI-powered CLI to instantly analyze and explain complex logs.
Documentation
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(())
}