use super::Cmd; use crate::Path; use clap::{Arg, Command}; use std::{env, error::Error}; pub struct Echo { name: &'static str, path: Option, } pub const ECHO: Echo = Echo { name: "echo", path: Some(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") .version(env!("CARGO_PKG_VERSION")) .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 } }