use nanoargs::{extract, ArgBuilder, Flag, Opt, ParseError};
fn main() {
let parser = ArgBuilder::new()
.name("export")
.description("Export data in various formats")
.version("1.0.0")
.flag(Flag::new("stdin").desc("Read from standard input"))
.option(Opt::new("file").placeholder("PATH").desc("Read from a file").short('f'))
.flag(Flag::new("json").desc("Output as JSON"))
.flag(Flag::new("csv").desc("Output as CSV"))
.flag(Flag::new("yaml").desc("Output as YAML"))
.group("input source", &["stdin", "file"])
.conflict("output format", &["json", "csv", "yaml"])
.build()
.unwrap();
match parser.parse_env() {
Ok(result) => {
let opts = extract!(result, {
stdin: bool,
file: Option<String>,
json: bool,
csv: bool,
yaml: bool,
})
.unwrap();
let source = if opts.stdin {
"stdin".to_string()
} else {
format!("file: {}", opts.file.unwrap())
};
let format = if opts.json {
"JSON"
} else if opts.csv {
"CSV"
} else if opts.yaml {
"YAML"
} else {
"text"
};
println!("Exporting from {source} as {format}");
}
Err(ParseError::HelpRequested(text)) => print!("{text}"),
Err(ParseError::VersionRequested(text)) => println!("{text}"),
Err(e) => eprintln!("{e}"),
}
}