use cmdopts::{parse_opts, CmdOpt, InfoCode, ParseError, ProcessCode};
#[allow(unused_imports)]
pub fn main() {
use std::cell::Cell;
use CmdOpt::*;
use InfoCode::*;
use OptId::*;
use ParseError::*;
use ProcessCode::*;
#[derive(Clone, Copy)]
enum OptId {
OptA,
OptB,
}
impl Default for OptId {
fn default() -> Self {
OptA
}
}
let opt_id: Cell<OptId> = Default::default();
let rc = parse_opts(
|opt, _| {
match opt {
Short(c) => {
match c {
'a' => {
opt_id.set(OptA);
NoValueOpt
}
'b' => {
opt_id.set(OptB);
ValueOpt
}
_ => InfoCode::InvalidOpt,
}
}
Long(s) => {
match s.as_str() {
"long_a" => {
opt_id.set(OptA);
NoValueOpt
}
"long_b" => {
opt_id.set(OptB);
ValueOpt
}
_ => InfoCode::InvalidOpt,
}
}
}
},
|opt, val| {
opt.as_ref()
.ok_or(GenericErr("Non-option detected".to_string()))?;
match opt_id.get() {
OptA => {
println!("A option");
}
OptB => {
println!("B option with {}", val.as_ref().unwrap().val);
}
};
Ok(ProcessCode::Continue)
},
);
if rc.is_err() {
eprintln!("[ERROR] {}", rc.unwrap_err());
}
}