use super::Cmd; use clap::{Arg, ArgAction, Command}; use std::path::Path; #[derive(Debug)] pub struct Dirname { name: &'static str, path: Option, } pub const DIRNAME: Dirname = Dirname { name: "dirname", path: Some(crate::Path::UsrBin), }; impl Cmd for Dirname { fn name(&self) -> &str { self.name } fn cli(&self) -> clap::Command { Command::new("dirname") .about("strip last component from file name") .args([ Arg::new("zero") .short('z') .long("zero") .help("end each output line with NUL, not newline") .action(ArgAction::SetTrue), Arg::new("name").num_args(1..).required(true), ]) } fn run(&self, matches: Option<&clap::ArgMatches>) -> Result<(), Box> { if let Some(matches) = matches { if let Some(names) = matches.get_many::("name") { names.for_each(|name| { let path = match Path::new(name).parent() { Some(p) => p, None => Path::new("."), }; let path = path.to_string_lossy(); let path = if path.is_empty() { String::from(".") } else { path.to_string() }; if matches.get_flag("zero") { print!("{}\0", path); } else { println!("{}", path); } }); } } Ok(()) } fn path(&self) -> Option { self.path } }