trackWork 0.15.0

A terminal-based time tracking application for managing work sessions
use rusqlite::{Connection, Result};

fn main() -> Result<()> {
    let db_path = dirs::home_dir()
        .unwrap_or_else(|| std::path::PathBuf::from("."))
        .join(".timetrack.db");

    println!("Opening database: {:?}", db_path);
    let conn = Connection::open(db_path)?;

    println!("\n=== All Time Entries ===\n");
    let mut stmt = conn.prepare(
        "SELECT id, description, start_time, end_time, display_order, COALESCE(color, 0)
         FROM time_entries
         ORDER BY start_time DESC"
    )?;

    let entries = stmt.query_map([], |row| {
        Ok((
            row.get::<_, i64>(0)?,
            row.get::<_, String>(1)?,
            row.get::<_, String>(2)?,
            row.get::<_, Option<String>>(3)?,
            row.get::<_, i64>(4)?,
            row.get::<_, i64>(5)?,
        ))
    })?;

    println!("{:<5} {:<30} {:<20} {:<20} {:<6} {:<6}", "ID", "Description", "Start Time", "End Time", "Order", "Color");
    println!("{}", "=".repeat(100));

    for entry in entries {
        let (id, desc, start, end, order, color) = entry?;
        let end_display = end.unwrap_or_else(|| "RUNNING".to_string());
        let desc_display = if desc.chars().count() > 28 {
            let truncated: String = desc.chars().take(28).collect();
            format!("{}...", truncated)
        } else {
            desc
        };
        println!("{:<5} {:<30} {:<20} {:<20} {:<6} {:<6}",
            id,
            desc_display,
            start,
            end_display,
            order,
            color
        );
    }

    println!("\n=== Today's Entries ===\n");
    let today = chrono::Local::now().format("%Y-%m-%d").to_string();
    let mut stmt = conn.prepare(
        "SELECT id, description, start_time, end_time
         FROM time_entries
         WHERE date(start_time) = ?1
         ORDER BY display_order ASC"
    )?;

    let entries = stmt.query_map([today.clone()], |row| {
        Ok((
            row.get::<_, i64>(0)?,
            row.get::<_, String>(1)?,
            row.get::<_, String>(2)?,
            row.get::<_, Option<String>>(3)?,
        ))
    })?;

    println!("Date: {}", today);
    println!("{:<5} {:<30} {:<20} {:<20}", "ID", "Description", "Start Time", "End Time");
    println!("{}", "=".repeat(80));

    for entry in entries {
        let (id, desc, start, end) = entry?;
        let end_display = end.unwrap_or_else(|| "RUNNING".to_string());
        let desc_display = if desc.chars().count() > 28 {
            let truncated: String = desc.chars().take(28).collect();
            format!("{}...", truncated)
        } else {
            desc
        };
        println!("{:<5} {:<30} {:<20} {:<20}",
            id,
            desc_display,
            start,
            end_display
        );
    }

    Ok(())
}