use std::path::PathBuf;
use log::LevelFilter;
use structopt::StructOpt;
use crate::DebugOption;
#[derive(Debug, Clone, StructOpt)]
#[structopt(name = "Monument", about = "Fast and flexible composition generator")]
pub struct CliArgs {
#[structopt(parse(from_os_str))]
pub input_file: PathBuf,
#[structopt(flatten)]
pub options: Options,
#[structopt(short, long = "verbose", parse(from_occurrences))]
pub verbosity: usize,
#[structopt(short, long = "quiet", parse(from_occurrences))]
pub quietness: usize,
}
#[derive(Default, Debug, Clone, StructOpt)]
pub struct Options {
pub num_threads: Option<usize>,
#[structopt(long)]
pub graph_size_limit: Option<usize>,
#[structopt(short = "M", long, parse(try_from_str = parse_big_int))]
pub mem_limit: Option<usize>,
#[structopt(short = "D", long)]
pub debug_option: Option<DebugOption>,
#[structopt(long = "only-update-line")]
pub only_display_update_line: bool,
#[structopt(long = "no-comp-numbers")]
pub dont_display_comp_numbers: bool,
}
impl CliArgs {
pub fn log_level(&self) -> LevelFilter {
match self.verbosity as isize - self.quietness as isize {
x if x < -2 => LevelFilter::Off, -2 => LevelFilter::Error, -1 => LevelFilter::Warn, 0 => LevelFilter::Info, 1 => LevelFilter::Debug, 2 => LevelFilter::Trace, _ => LevelFilter::Trace, }
}
}
fn parse_big_int(s: &str) -> anyhow::Result<usize> {
let (last_char_idx, last_char) = s.char_indices().last().unwrap();
let mut number_string = &s[..last_char_idx];
let mut multiplier = 1usize;
match last_char {
'k' | 'K' => multiplier = 1_000,
'm' | 'M' => multiplier = 1_000_000,
'g' | 'G' => multiplier = 1_000_000_000,
't' | 'T' => multiplier = 1_000_000_000_000,
'0'..='9' => number_string = s, _ => {
return Err(anyhow::Error::msg(
"Expected number with a multiplier from [KMGT]",
));
}
}
Ok(number_string.parse::<usize>()? * multiplier)
}