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(())
}