focuz 0.0.1

Lightweight Beautiful Terminal Pomodoro Timer
Documentation
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 for the timer (e.g., "10s", "5m", "2h")
    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(())
}