adnv 1.5.0

CLI that tracks, checks and auto-updates infrastructure dependency versions across Terraform, Helm, Docker, Git and npm
Documentation
use std::path::PathBuf;

use clap::Parser;
use miette::Result;

mod commands;

const LONG_VERSION: &str = const_format::formatcp!(
    "\
{version} ({build_version} {profile} {build_target})

Build time   : {build_time}
Git commit   : {git_commit}
Rust version : {rust_version}",
    version = adnv::build_info::PKG_VERSION,
    profile = adnv::build_info::PROFILE,
    build_version = if let Some(version) = adnv::build_info::GIT_VERSION {
        version
    } else {
        const_format::formatcp!("v{}", adnv::build_info::PKG_VERSION)
    },
    build_time = adnv::build_info::BUILT_TIME_UTC,
    build_target = adnv::build_info::TARGET,
    git_commit = if let Some(commit_id) = adnv::build_info::GIT_COMMIT_HASH {
        commit_id
    } else {
        "N/A"
    },
    rust_version = adnv::build_info::RUSTC_VERSION,
);

#[derive(Debug, Parser)]
#[command(version, author, about, long_version = LONG_VERSION)]
struct Options {
    #[arg(short, long, env = "ADNV_CONFIG_FILE", default_value = "adnv.yml")]
    config: PathBuf,

    #[command(subcommand)]
    subcommand: commands::Command,
}

#[tokio::main]
async fn main() -> Result<()> {
    setup_logger();

    let options = Options::parse();
    let config = if options.config.exists() {
        Some(adnv::Config::load(&options.config)?)
    } else {
        None
    };

    options.subcommand.run(config.as_ref()).await
}

fn setup_logger() {
    use tracing_subscriber::prelude::*;
    use tracing_subscriber::{EnvFilter, filter::LevelFilter, fmt};

    let fmt_layer = fmt::layer().without_time().with_target(false);

    let filter_layer = EnvFilter::builder()
        .with_default_directive(LevelFilter::INFO.into())
        .from_env_lossy();

    tracing_subscriber::registry()
        .with(filter_layer)
        .with(fmt_layer)
        .init();
}