t_trace 0.1.3

High-performance, command-line statistics tracker for your shell
Documentation
use anyhow::Result;
use clap::Parser;
use daemonize::Daemonize;
use t_trace::cli::{Cli, Commands, DaemonArgs, DaemonCommands, InitArgs};
use t_trace::{daemon, handlers, init};

fn main() -> Result<()> {
    let cli = Cli::parse();
    let pid_file = "/tmp/t_trace.pid";

    if let Commands::Init(InitArgs { shell }) = cli.command {
        init::print_script(shell);
        return Ok(());
    }

    if let Commands::Daemon(DaemonArgs {
        command: DaemonCommands::Run,
    }) = cli.command
    {
        println!("Starting t_trace daemon in the background...");
        let daemonize = Daemonize::new().pid_file(pid_file).working_directory("/");

        match daemonize.start() {
            Ok(_) => {
                let daemon_rt = tokio::runtime::Runtime::new()
                    .expect("Failed to create Tokio runtime for daemon");
                if let Err(e) = daemon_rt.block_on(daemon::run()) {
                    eprintln!("Daemon failed: {}", e);
                }
            }
            Err(e) => eprintln!("Error, could not start daemon: {}", e),
        }
        return Ok(());
    }

    let rt = tokio::runtime::Builder::new_current_thread()
        .enable_all()
        .build()?;

    rt.block_on(async {
        match cli.command {
            Commands::Daemon(DaemonArgs { command }) => match command {
                DaemonCommands::Run => unreachable!(),
                DaemonCommands::Stop => {
                    handlers::handle_daemon_stop().await?;
                }
                DaemonCommands::HealthCheck => handlers::handle_daemon_health_check().await?,
                DaemonCommands::CommandBegin { pid, command } => {
                    handlers::handle_daemon_command_begin(pid, command).await?
                }
                DaemonCommands::CommandEnd { pid, exit_code } => {
                    handlers::handle_daemon_command_end(pid, exit_code).await?
                }
            },
            Commands::Stats { filter } => handlers::handle_stats(filter).await?,
            Commands::Init(_) => unreachable!(),
        }

        Ok::<(), anyhow::Error>(())
    })
}