use crate::config::Loglevel;
use crate::service::OgcApiService;
use clap::{ArgMatches, Args, Command, CommandFactory, FromArgMatches, Parser, Subcommand};
use log::warn;
use std::env;
use std::path::PathBuf;
#[derive(Args, Debug)]
pub struct GlobalArgs {
#[arg(short, long, value_name = "FILE")]
pub config: Option<PathBuf>,
#[arg(long)]
pub loglevel: Option<Loglevel>,
}
#[derive(Parser, Debug)]
pub enum CommonCommands {
Serve(ServeArgs),
}
#[derive(Args, Debug)]
pub struct ServeArgs {
pub file_or_url: Option<String>,
}
#[derive(Parser, Debug)]
pub enum NoCommands {}
#[derive(Args, Debug)]
pub struct NoArgs;
#[derive(Clone)]
pub struct CliArgs {
cli: Command,
}
impl CliArgs {
pub fn register_args<C: Subcommand, A: clap::Args>(&mut self) {
let mut cli = C::augment_subcommands(self.cli.clone());
if std::any::type_name::<A>() != "bbox_core::cli::NoArgs" {
cli = A::augment_args(cli);
}
self.cli = cli;
}
pub fn register_service_args<S: OgcApiService>(&mut self) {
self.register_args::<S::CliCommands, S::CliArgs>();
}
pub fn cli_matches(&self) -> ArgMatches {
self.cli.clone().get_matches()
}
pub fn apply_global_args(&self) {
let Ok(args) = GlobalArgs::from_arg_matches(&self.cli_matches()) else {
warn!("GlobalArgs::from_arg_matches error");
return;
};
if let Some(config) = args.config {
env::set_var("BBOX_CONFIG", config);
}
}
}
impl Default for CliArgs {
fn default() -> Self {
Self {
cli: NoCommands::command(),
}
}
}