use blarg::{Collection, CommandLineParser, GeneralParser, Nargs, Parameter, Switch};
#[derive(Debug, PartialEq, Eq)]
pub struct Params {
verbose: bool,
items: Vec<u32>,
}
impl Params {
fn init() -> Self {
Self {
verbose: false,
items: Vec::default(),
}
}
}
fn main() {
let params = parse();
let sum: u32 = params.items.iter().sum();
println!("Sum: {sum}");
}
fn parse() -> Params {
parse_tokens(|parser: GeneralParser| Ok(parser.parse()))
}
fn parse_tokens(parse_fn: impl FnOnce(GeneralParser) -> Result<(), i32>) -> Params {
let mut params = Params::init();
let clp = CommandLineParser::new("organization");
let parser = clp
.add(Parameter::option(
Switch::new(&mut params.verbose, true),
"verbose",
Some('v'),
))
.add(Parameter::argument(
Collection::new(&mut params.items, Nargs::AtLeastOne),
"item",
))
.build();
parse_fn(parser).expect("test-reachable-only");
params
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
#[should_panic]
fn parse_empty() {
let tokens = vec![];
parse_tokens(|parser| parser.parse_tokens(tokens.as_slice()));
}
#[test]
fn parse() {
let tokens = vec!["5"];
let result = parse_tokens(|parser| parser.parse_tokens(tokens.as_slice()));
assert_eq!(
result,
Params {
verbose: false,
items: vec![5],
}
);
}
}