exp 0.1.1

CLI experiment tracker for agent runs, prompt testing, and simulations
use anyhow::Result;
use rusqlite::Connection;

use crate::db;

pub fn run(conn: &Connection, experiment: &str) -> Result<()> {
    let exp_id = db::resolve_experiment_id(conn, experiment)?;

    let (name, status, description, created_at): (String, String, Option<String>, String) = conn.query_row(
        "SELECT name, status, description, created_at FROM experiments WHERE id = ?1",
        [&exp_id],
        |row| Ok((row.get(0)?, row.get(1)?, row.get(2)?, row.get(3)?)),
    )?;

    println!("Experiment: {name} ({exp_id})");
    println!("Status: {status}");
    if let Some(desc) = description {
        println!("Description: {desc}");
    }
    println!("Created: {created_at}");

    let total_runs: i64 = conn.query_row(
        "SELECT COUNT(*) FROM runs WHERE exp_id = ?1",
        [&exp_id],
        |row| row.get(0),
    )?;
    let completed_runs: i64 = conn.query_row(
        "SELECT COUNT(*) FROM runs WHERE exp_id = ?1 AND status = 'completed'",
        [&exp_id],
        |row| row.get(0),
    )?;
    let failed_runs: i64 = conn.query_row(
        "SELECT COUNT(*) FROM runs WHERE exp_id = ?1 AND status = 'failed'",
        [&exp_id],
        |row| row.get(0),
    )?;

    println!("\nRuns: {completed_runs} completed, {failed_runs} failed, {total_runs} total");

    Ok(())
}