From f4bd4de2e437e278d19c0e8ba47f67eb11896c9e Mon Sep 17 00:00:00 2001 From: emma Date: Tue, 10 Sep 2024 02:42:55 -0600 Subject: [PATCH] fileis(1): various changes to make the code more efficient and idiomatic --- src/fileis.rs | 40 ++++++++++++++++++++++------------------ 1 file changed, 22 insertions(+), 18 deletions(-) diff --git a/src/fileis.rs b/src/fileis.rs index 9ad651e..b81b624 100644 --- a/src/fileis.rs +++ b/src/fileis.rs @@ -1,5 +1,6 @@ /* * Copyright (c) 2024 DTB + * Copyright (c) 2024 Emma Tebibyte * SPDX-License-Identifier: AGPL-3.0-or-later * * This program is free software: you can redistribute it and/or modify it under @@ -24,23 +25,27 @@ use std::{ }; extern crate getopt; -use getopt::GetOpt; - +extern crate strerror; extern crate sysexits; + +use getopt::GetOpt; +use strerror::StrError; use sysexits::EX_USAGE; -fn usage(s: &str) -> ExitCode { - eprintln!("Usage: {} [-bcdefgkprsuwxLS] file...", s); - ExitCode::from(EX_USAGE as u8) +const OPTS: &str = "bcdefgkprsuwxLS"; + +fn usage(argv0: &str) -> ExitCode { + eprintln!("Usage: {} [-{}] file...", argv0, OPTS); + ExitCode::from(EX_USAGE) } fn main() -> ExitCode { - let argv = args().collect::>(); + let argv = args().collect::>(); - let mut sel = String::from(""); // selected options + let mut sel = String::with_capacity(OPTS.len()); // selected options let mut optind: usize = 1; // argv[0] - while let Some(opt) = argv.getopt("bcdefgkprsuwxLS") { + while let Some(opt) = argv.getopt(OPTS) { if let Ok(optchr) = opt.opt() { sel.push_str(optchr); } else { return usage(&argv[0]); } @@ -50,17 +55,16 @@ fn main() -> ExitCode { if optind == argv.len() { return usage(&argv[0]); } for arg in argv.iter().skip(optind) { - let fmeta; // file metadata - let fmode; // file mode; see chmod(1p) - let ftype; // file type + let fmeta = match metadata(arg) { + Ok(m) => m, + Err(e) => { // no perms or nonexistent + eprintln!("{}: {}: {}", argv[0], arg, e.strerror()); + return ExitCode::FAILURE; + }, + }; - match metadata(arg) { - Ok(m) => fmeta = m, - _ => { return ExitCode::FAILURE; } // no perms or nonexistent - } - - fmode = fmeta.mode(); - ftype = fmeta.file_type(); + let fmode = fmeta.mode(); + let ftype = fmeta.file_type(); for selection in sel.chars() { // run all selected tests match selection {