zenops 0.6.1

Declarative system configuration management for shell config and dotfiles.
Documentation
use clap::{CommandFactory, Parser};
use zenops::config_files::ConfigFileDirs;

#[derive(Parser, Debug)]
#[command(name = "zenops", about = "ZenOps: your system’s calm overseer")]
pub struct Cli {
    #[clap(flatten)]
    args: zenops::Args,

    #[clap(long, short, default_value = "log")]
    output: OutputMode,

    #[command(subcommand)]
    command: zenops::Cmd,
}

#[derive(Clone, Copy, Debug, clap::ValueEnum)]
pub enum OutputMode {
    Log,
}

fn main() {
    let Cli {
        args,
        output,
        command,
    } = Cli::parse();

    if let zenops::Cmd::Completions { shell } = &command {
        let mut cmd = Cli::command();
        clap_complete::generate(*shell, &mut cmd, "zenops", &mut std::io::stdout());
        return;
    }

    env_logger::builder()
        .filter_level(log::LevelFilter::Info)
        .parse_default_env()
        .format_timestamp(None)
        .format_target(false)
        .init();

    let mut output: Box<dyn zenops::output::Output> = match output {
        OutputMode::Log => Box::new(zenops::output::Log),
    };

    let dirs = ConfigFileDirs::load(home::home_dir().unwrap());

    if let Err(e) = zenops::real_main(&args, &command, &dirs, output.as_mut()) {
        log::error!("{e}");
        std::process::exit(1);
    }
}