dtime 1.0.2

A professional, cross-platform datetime display utility with colored output and millisecond precision
Documentation
//! File: src\main.rs
//! Author: Hadi Cahyadi <cumulus13@gmail.com>
//! Date: 2026-05-09
//! Description:
//! License: MIT

use anyhow::Result;
use clap_version_flag::colorful_version;
use dtime::{Config, DateTimeInfo};
use std::thread;
use std::time::Duration;

fn main() -> Result<()> {
    let args: Vec<String> = std::env::args().collect();
    if args.len() == 2 && (args[1] == "-V" || args[1] == "--version") {
        let version = colorful_version!();
        version.print_and_exit();
    }

    // Parse command line arguments
    let config = Config::from_args();

    // Check for monitor mode
    if let Some(interval) = config.monitor {
        run_monitor_mode(&config, interval)?;
    } else {
        run_single_output(&config)?;
    }

    Ok(())
}

fn run_single_output(config: &Config) -> Result<()> {
    let dt_info = DateTimeInfo::new(config);

    match config.output_format.as_str() {
        "json" => {
            println!("{}", dt_info.format_json());
        }
        "plain" => {
            println!("{}", dt_info.format_plain());
        }
        _ => {
            if config.no_color {
                println!("{}", dt_info.format_plain());
            } else {
                println!("{}", dt_info.format_colored());
            }
        }
    }

    Ok(())
}

fn run_monitor_mode(config: &Config, interval: u64) -> Result<()> {
    let duration = Duration::from_secs(interval);

    println!("dtime monitor mode - Press Ctrl+C to exit\n");

    loop {
        let dt_info = DateTimeInfo::new(config);

        // Clear screen (cross-platform)
        print!("\x1B[2J\x1B[1;1H");

        match config.output_format.as_str() {
            "json" => {
                println!("{}", dt_info.format_json());
            }
            "plain" => {
                println!("{}", dt_info.format_plain());
            }
            _ => {
                if config.no_color {
                    println!("{}", dt_info.format_plain());
                } else {
                    println!("{}", dt_info.format_colored());
                }
            }
        }

        println!("\nUpdating every {} second(s)...", interval);

        thread::sleep(duration);
    }
}