diff --git a/Cargo.lock b/Cargo.lock index 8de41c97d..64254d4e9 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1904,7 +1904,7 @@ dependencies = [ name = "uu_printenv" version = "0.0.1" dependencies = [ - "getopts 0.2.21 (registry+https://github.com/rust-lang/crates.io-index)", + "clap 2.33.3 (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/printenv/Cargo.toml b/src/uu/printenv/Cargo.toml index d3c4376a6..68db1b689 100644 --- a/src/uu/printenv/Cargo.toml +++ b/src/uu/printenv/Cargo.toml @@ -15,7 +15,7 @@ edition = "2018" path = "src/printenv.rs" [dependencies] -getopts = "0.2.18" +clap = "2.33" uucore = { version="0.0.4", package="uucore", git="https://github.com/uutils/uucore.git", branch="canary" } uucore_procs = { version="0.0.4", package="uucore_procs", git="https://github.com/uutils/uucore.git", branch="canary" } diff --git a/src/uu/printenv/src/printenv.rs b/src/uu/printenv/src/printenv.rs index 16dd6f0b0..78f90382a 100644 --- a/src/uu/printenv/src/printenv.rs +++ b/src/uu/printenv/src/printenv.rs @@ -7,69 +7,67 @@ /* last synced with: printenv (GNU coreutils) 8.13 */ -extern crate getopts; +extern crate clap; #[macro_use] extern crate uucore; +use clap::{App, Arg}; use std::env; -static NAME: &str = "printenv"; +static ABOUT: &str = "Display the values of the specified environment VARIABLE(s), or (with no VARIABLE) display name and value pairs for them all."; static VERSION: &str = env!("CARGO_PKG_VERSION"); -pub fn uumain(args: impl uucore::Args) -> i32 { - let args = args.collect_str(); +static OPT_NULL: &str = "null"; - let mut opts = getopts::Options::new(); - opts.optflag( - "0", - "null", - "end each output line with 0 byte rather than newline", - ); - opts.optflag("h", "help", "display this help and exit"); - opts.optflag("V", "version", "output version information and exit"); - let matches = match opts.parse(&args[1..]) { - Ok(m) => m, - Err(f) => crash!(1, "Invalid options\n{}", f), - }; - if matches.opt_present("help") { - let msg = format!( - "{0} {1} +static ARG_VARIABLES: &str = "variables"; -Usage: - {0} [VARIABLE]... [OPTION]... - -Prints the given environment VARIABLE(s), otherwise prints them all.", - NAME, VERSION - ); - print!("{}", opts.usage(&msg)); - return 0; - } - if matches.opt_present("version") { - println!("{} {}", NAME, VERSION); - return 0; - } - let mut separator = "\n"; - if matches.opt_present("null") { - separator = "\x00"; - }; - - exec(matches.free, separator); - - 0 +fn get_usage() -> String { + format!("{0} [VARIABLE]... [OPTION]...", executable!()) } -pub fn exec(args: Vec, separator: &str) { - if args.is_empty() { +pub fn uumain(args: impl uucore::Args) -> i32 { + let usage = get_usage(); + + let matches = App::new(executable!()) + .version(VERSION) + .about(ABOUT) + .usage(&usage[..]) + .arg( + Arg::with_name(OPT_NULL) + .short("0") + .long(OPT_NULL) + .help("end each output line with 0 byte rather than newline"), + ) + .arg( + Arg::with_name(ARG_VARIABLES) + .multiple(true) + .takes_value(true) + .min_values(1), + ) + .get_matches_from(args); + + let variables: Vec = matches + .values_of(ARG_VARIABLES) + .map(|v| v.map(ToString::to_string).collect()) + .unwrap_or_default(); + + let mut separator = "\n"; + if matches.is_present(OPT_NULL) { + separator = "\x00"; + } + + if variables.is_empty() { for (env_var, value) in env::vars() { print!("{}={}{}", env_var, value, separator); } - return; + return 0; } - for env_var in &args { + for env_var in variables { if let Ok(var) = env::var(env_var) { print!("{}{}", var, separator); } } + 0 }