mod base_resolver;
mod commands;
mod diff;
mod patch;
mod serializer;
mod tree;
mod types;
use std::process;
use clap::{Parser, Subcommand};
use base_resolver::bundled_version;
const CLI_VERSION: &str = "0.1.0";
fn full_version() -> String {
let cat_part = match bundled_version() {
Some(v) => format!("bundled catalog {} @ {}", v.date, v.sha),
None => "bundled catalog unknown".to_string(),
};
format!("smokeping-config v{}\n{}", CLI_VERSION, cat_part)
}
#[derive(Parser)]
#[command(
name = "smokeping-config",
about = "SmokePing config builder — render Targets files from a committable patch YAML on top of a versioned base catalogue",
version = CLI_VERSION,
disable_version_flag = true,
)]
struct Cli {
#[arg(short = 'v', long = "version")]
version: bool,
#[command(subcommand)]
command: Option<Commands>,
}
#[derive(Subcommand)]
enum Commands {
Render {
patch: String,
#[arg(short = 'b', long)]
base: Option<String>,
#[arg(short = 'u', long)]
base_url: Option<String>,
#[arg(long, default_value = "warn")]
on_drift: String,
#[arg(short = 'o', long)]
out: Option<String>,
},
DiffBase {
patch: String,
#[arg(short = 'b', long)]
base: Option<String>,
#[arg(short = 'u', long)]
base_url: Option<String>,
#[arg(long, default_value = "warn")]
on_drift: String,
},
Init {
#[arg(short = 'o', long, default_value = "patch.yaml")]
out: String,
#[arg(short = 'f', long)]
force: bool,
},
}
fn main() {
let cli = Cli::parse();
if cli.version {
println!("{}", full_version());
process::exit(0);
}
let command = match cli.command {
Some(c) => c,
None => {
Cli::parse_from(["smokeping-config", "--help"]);
process::exit(0);
}
};
let exit_code = match command {
Commands::Render {
patch,
base,
base_url,
on_drift,
out,
} => commands::render::run_render(
&patch,
base.as_deref(),
base_url.as_deref(),
&on_drift,
out.as_deref(),
),
Commands::DiffBase {
patch,
base,
base_url,
on_drift,
} => commands::diff_base::run_diff_base(
&patch,
base.as_deref(),
base_url.as_deref(),
&on_drift,
),
Commands::Init { out, force } => commands::init::run_init(&out, force),
};
process::exit(exit_code);
}