use std::path::PathBuf;
use clap::Parser;
use tracing::Level;
use crate::config::{DEFAULT_MONOCORE_HOME, DEFAULT_SERVER_PORT};
use super::styles;
#[derive(Debug, Parser)]
#[command(name = "monocore", author, about, version, styles=styles::styles())]
pub struct MonocoreArgs {
#[command(subcommand)]
pub subcommand: Option<MonocoreSubcommand>,
#[arg(short, long)]
pub verbose: bool,
}
#[derive(Debug, Parser)]
pub enum MonocoreSubcommand {
#[command(arg_required_else_help = true)]
Up {
#[arg(short, long, default_value = "monocore.toml")]
file: PathBuf,
#[arg(short, long)]
group: Option<String>,
#[arg(long, default_value = DEFAULT_MONOCORE_HOME.as_os_str())]
home_dir: PathBuf,
},
Down {
#[arg(short, long)]
file: Option<PathBuf>,
#[arg(short, long)]
group: Option<String>,
#[arg(long, default_value = DEFAULT_MONOCORE_HOME.as_os_str())]
home_dir: PathBuf,
},
#[command(arg_required_else_help = true)]
Pull {
#[arg(required = true)]
image: String,
#[arg(long, default_value = DEFAULT_MONOCORE_HOME.as_os_str())]
home_dir: PathBuf,
},
Status {},
#[command(arg_required_else_help = true)]
Log {
#[arg(required = true)]
service: String,
#[arg(short = 'n')]
lines: Option<usize>,
#[arg(long)]
no_pager: bool,
#[arg(short = 'f', long)]
follow: bool,
#[arg(long, default_value = DEFAULT_MONOCORE_HOME.as_os_str())]
home_dir: PathBuf,
},
#[command(alias = "rm", arg_required_else_help = true)]
Remove {
#[arg(required_unless_present = "group")]
services: Vec<String>,
#[arg(short, long)]
group: Option<String>,
#[arg(long, default_value = DEFAULT_MONOCORE_HOME.as_os_str())]
home_dir: PathBuf,
},
Serve {
#[arg(short, long, default_value_t = std::env::var("PORT").unwrap_or(DEFAULT_SERVER_PORT.to_string()).parse().unwrap())]
port: u16,
#[arg(long, default_value = DEFAULT_MONOCORE_HOME.as_os_str())]
home_dir: PathBuf,
},
}
impl MonocoreArgs {
pub fn init_logging(&self) {
let level = if self.verbose {
Level::DEBUG
} else {
Level::INFO
};
tracing_subscriber::fmt().with_max_level(level).init();
}
}