From dc7f34cc9b71e424b1eef76b16909e389c8f86ae Mon Sep 17 00:00:00 2001
From: Sylvestre Ledru <sylvestre@debian.org>
Date: Fri, 26 Jan 2024 19:41:03 +0100
Subject: [PATCH] renice: use clap for real

---
 src/uu/renice/src/renice.rs | 47 ++++++++++++++++++++++++-------------
 1 file changed, 31 insertions(+), 16 deletions(-)

diff --git a/src/uu/renice/src/renice.rs b/src/uu/renice/src/renice.rs
index 76305ef..883c22e 100644
--- a/src/uu/renice/src/renice.rs
+++ b/src/uu/renice/src/renice.rs
@@ -11,28 +11,29 @@ use std::str::FromStr;
 use uucore::{error::UResult, format_usage, help_about, help_usage};
 const ABOUT: &str = help_about!("renice.md");
 const USAGE: &str = help_usage!("renice.md");
-use clap::{crate_version, Command};
+use clap::{crate_version, Arg, Command};
 
 #[uucore::main]
 pub fn uumain(args: impl uucore::Args) -> UResult<()> {
-    let args: Vec<String> = env::args().collect();
+    let matches = uu_app().try_get_matches_from(args)?;
 
-    if args.len() != 3 {
-        eprintln!("Usage: renice <nice value> <pid>");
-        process::exit(1);
-    }
+    let nice_value = match matches.get_one::<i32>("nice_value") {
+        Some(number) => number,
+        _ => {
+            eprintln!("Invalid nice value");
+            process::exit(1);
+        }
+    };
 
-    let nice_value = i32::from_str(&args[1]).unwrap_or_else(|_| {
-        eprintln!("Invalid nice value");
-        process::exit(1);
-    });
+    let pid = match matches.get_one::<i32>("pid") {
+        Some(number) => number,
+        _ => {
+            eprintln!("Invalid PID");
+            process::exit(1);
+        }
+    };
 
-    let pid = i32::from_str(&args[2]).unwrap_or_else(|_| {
-        eprintln!("Invalid PID");
-        process::exit(1);
-    });
-
-    if unsafe { libc::setpriority(PRIO_PROCESS, pid.try_into().unwrap(), nice_value) } == -1 {
+    if unsafe { libc::setpriority(PRIO_PROCESS, (*pid).try_into().unwrap(), *nice_value) } == -1 {
         eprintln!("Failed to set nice value: {}", Error::last_os_error());
         process::exit(1);
     }
@@ -47,4 +48,18 @@ pub fn uu_app() -> Command {
         .about(ABOUT)
         .override_usage(format_usage(USAGE))
         .infer_long_args(true)
+        .arg(
+            Arg::new("nice_value")
+                .value_name("NICE_VALUE")
+                .help("The new nice value for the process")
+                .required(true)
+                .index(1),
+        )
+        .arg(
+            Arg::new("pid")
+                .value_name("PID")
+                .help("The PID of the process")
+                .required(true)
+                .index(2),
+        )
 }