use std::time::Duration;
use crate::timer::Timer;
use clap::Parser;
use colored::Colorize;
#[derive(Parser)]
#[command(name = "focuz")]
#[command(about = "A beautiful terminal Pomodoro timer", long_about = None)]
struct Cli {
duration: String,
}
pub fn parse_duration(input: &str) -> Result<Duration, String> {
let input = input.trim().to_lowercase();
let mut result = Duration::from_secs(1);
if input.ends_with('m') {
let mins = input[..input.len() - 1]
.parse::<u64>()
.map_err(|_| "Invalid number format")?;
result = result.saturating_add(Duration::from_secs(mins * 60));
} else if input.ends_with('s') {
let secs = input[..input.len() - 1]
.parse::<u64>()
.map_err(|_| "Invalid number format")?;
result = result.saturating_add(Duration::from_secs(secs));
} else if input.ends_with('h') {
let hours = input[..input.len() - 1]
.parse::<u64>()
.map_err(|_| "Invalid number format")?;
result = result.saturating_add(Duration::from_secs(hours * 3600));
} else {
let secs = input
.parse::<u64>()
.map_err(|_| "Invalid duration format. Use format like '10m', '30s', or '1h'")?;
result = result.saturating_add(Duration::from_secs(secs));
}
Ok(result)
}
pub async fn run() -> Result<(), String> {
let cli = Cli::parse();
match parse_duration(&cli.duration) {
Ok(dur) => {
let mut timer = Timer::new(dur);
timer.start().await.map_err(|e| e.to_string())?;
}
Err(e) => {
eprintln!("{} {}", "Error:".bright_red().bold(), e);
eprintln!("Usage: timer <duration>");
eprintln!("Examples: timer 10m, timer 30s, timer 2h");
}
}
Ok(())
}