use std::ffi::OsStr;
use crate::error::{Error, Result};
#[derive(Debug, Default)]
pub struct Flags {
pub debug: bool,
pub namespace: String,
pub id: String,
pub socket: String,
pub bundle: String,
pub address: String,
pub publish_binary: String,
pub action: String,
pub version: bool,
pub info: bool,
}
#[cfg_attr(feature = "tracing", tracing::instrument(skip_all, level = "Info"))]
pub fn parse<S: AsRef<OsStr>>(args: &[S]) -> Result<Flags> {
let mut flags = Flags::default();
let mut version_short = false;
let mut version_long = false;
let args: Vec<String> = go_flag::parse_args(args, |f| {
f.add_flag("debug", &mut flags.debug);
f.add_flag("v", &mut version_short);
f.add_flag("version", &mut version_long);
f.add_flag("namespace", &mut flags.namespace);
f.add_flag("id", &mut flags.id);
f.add_flag("socket", &mut flags.socket);
f.add_flag("bundle", &mut flags.bundle);
f.add_flag("address", &mut flags.address);
f.add_flag("publish-binary", &mut flags.publish_binary);
f.add_flag("info", &mut flags.info);
})
.map_err(|e| Error::InvalidArgument(e.to_string()))?;
flags.version = version_short || version_long;
if let Some(action) = args.first() {
flags.action = action.into();
}
Ok(flags)
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn parse_all() {
let args = [
"-debug",
"-id",
"123",
"-namespace",
"default",
"-socket",
"/path/to/socket",
"-publish-binary",
"/path/to/binary",
"-bundle",
"bundle",
"-address",
"address",
"delete",
];
let flags = parse(&args).unwrap();
assert!(flags.debug);
assert!(!flags.version);
assert_eq!(flags.id, "123");
assert_eq!(flags.namespace, "default");
assert_eq!(flags.socket, "/path/to/socket");
assert_eq!(flags.publish_binary, "/path/to/binary");
assert_eq!(flags.bundle, "bundle");
assert_eq!(flags.address, "address");
assert_eq!(flags.action, "delete");
}
#[test]
fn parse_flags() {
let args = ["-id", "123", "-namespace", "default"];
let flags = parse(&args).unwrap();
assert!(!flags.debug);
assert_eq!(flags.id, "123");
assert_eq!(flags.namespace, "default");
assert_eq!(flags.action, "");
}
#[test]
fn parse_action() {
let args = ["-namespace", "1", "start"];
let flags = parse(&args).unwrap();
assert_eq!(flags.action, "start");
assert_eq!(flags.id, "");
}
#[test]
fn parse_version_long_flag() {
let flags = parse(&["-version"]).unwrap();
assert!(flags.version);
}
#[test]
fn parse_version_short_flag() {
let flags = parse(&["-v"]).unwrap();
assert!(flags.version);
}
}