diff --git a/Cargo.lock b/Cargo.lock index c9587a470..78d8dd77a 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1334,6 +1334,7 @@ dependencies = [ name = "uu_groups" version = "0.0.1" dependencies = [ + "clap 2.33.1 (registry+https://github.com/rust-lang/crates.io-index)", "uucore 0.0.4 (git+https://github.com/uutils/uucore.git?branch=canary)", "uucore_procs 0.0.4 (git+https://github.com/uutils/uucore.git?branch=canary)", ] diff --git a/src/uu/groups/Cargo.toml b/src/uu/groups/Cargo.toml index 20cc8cc21..fb6d193ed 100644 --- a/src/uu/groups/Cargo.toml +++ b/src/uu/groups/Cargo.toml @@ -17,6 +17,7 @@ path = "src/groups.rs" [dependencies] uucore = { version="0.0.4", package="uucore", git="https://github.com/uutils/uucore.git", branch="canary", features=["entries"] } uucore_procs = { version="0.0.4", package="uucore_procs", git="https://github.com/uutils/uucore.git", branch="canary" } +clap = "2.32" [[bin]] name = "groups" diff --git a/src/uu/groups/src/groups.rs b/src/uu/groups/src/groups.rs index 93e973c44..1ad5de7be 100644 --- a/src/uu/groups/src/groups.rs +++ b/src/uu/groups/src/groups.rs @@ -12,34 +12,54 @@ extern crate uucore; use uucore::entries::{get_groups, gid2grp, Locate, Passwd}; -static SYNTAX: &str = "[user]"; -static SUMMARY: &str = "display current group names"; +extern crate clap; +use clap::{App, Arg}; + +static VERSION: &str = env!("CARGO_PKG_VERSION"); +static ABOUT: &str = "display current group names"; +static OPT_USER: &str = "user"; + +fn get_usage() -> String { + format!("{0} [USERNAME]", executable!()) +} pub fn uumain(args: Vec) -> i32 { - let matches = app!(SYNTAX, SUMMARY, "").parse(args); + let usage = get_usage(); - if matches.free.is_empty() { - println!( - "{}", - get_groups() - .unwrap() - .iter() - .map(|&g| gid2grp(g).unwrap()) - .collect::>() - .join(" ") - ); - } else if let Ok(p) = Passwd::locate(matches.free[0].as_str()) { - println!( - "{}", - p.belongs_to() - .iter() - .map(|&g| gid2grp(g).unwrap()) - .collect::>() - .join(" ") - ); - } else { - crash!(1, "unknown user {}", matches.free[0]); + let matches = App::new(executable!()) + .version(VERSION) + .about(ABOUT) + .usage(&usage[..]) + .arg(Arg::with_name(OPT_USER)) + .get_matches_from(&args); + + match matches.value_of(OPT_USER) { + None => { + println!( + "{}", + get_groups() + .unwrap() + .iter() + .map(|&g| gid2grp(g).unwrap()) + .collect::>() + .join(" ") + ); + 0 + } + Some(user) => { + if let Ok(p) = Passwd::locate(user) { + println!( + "{}", + p.belongs_to() + .iter() + .map(|&g| gid2grp(g).unwrap()) + .collect::>() + .join(" ") + ); + 0 + } else { + crash!(1, "unknown user {}", user); + } + } } - - 0 }