use super::Cmd; use crate::Path; use clap::{Arg, Command}; use std::{env, error::Error}; #[derive(Debug)] pub struct Echo { name: &'static str, path: Option, } impl Default for Echo { fn default() -> Self { Self { name: "echo", path: Some(crate::Path::Bin), } } } impl Cmd for Echo { fn name(&self) -> &str { self.name } fn cli(&self) -> clap::Command { Command::new(self.name) .about("Display a line of text") .long_about("Echo the STRING(s) to standard output") .author("Nathan Fisher") .args([ Arg::new("inline") .short('n') .help("Do not output a trailing newline"), Arg::new("STRING").num_args(1..), ]) } fn run(&self, _matches: Option<&clap::ArgMatches>) -> Result<(), Box> { let args: Vec = env::args().collect(); let idx = match crate::progname() { Some(s) if s.as_str() == self.name() => 1, Some(_) => 2, None => unreachable!(), }; let len = args.len(); let n = len > idx && args[idx] == "-n"; let i = if n { idx + 1 } else { idx }; for (index, arg) in args.iter().enumerate().skip(i) { if index < len - 1 { print!("{arg} "); } else { print!("{arg}"); } } if !n { println!(); } Ok(()) } fn path(&self) -> Option { self.path } }