diff --git a/src/cmd/mod.rs b/src/cmd/mod.rs index 296a96e..3c21862 100644 --- a/src/cmd/mod.rs +++ b/src/cmd/mod.rs @@ -29,11 +29,13 @@ pub mod shitbox; pub mod sleep; mod sync; pub mod r#true; +pub mod yes; pub use { self::hostname::Hostname, base32::Base32, base64::Base64, bootstrap::Bootstrap, dirname::Dirname, echo::Echo, factor::Factor, head::Head, mountpoint::Mountpoint, nologin::Nologin, r#false::False, r#true::True, rev::Rev, shitbox::Shitbox, sleep::Sleep, + yes::Yes, }; pub trait Cmd: fmt::Debug + Sync { @@ -59,11 +61,12 @@ pub fn get(name: &str) -> Option> { "shitbox" => Some(Box::new(Shitbox::default())), "sleep" => Some(Box::new(Sleep::default())), "true" => Some(Box::new(True::default())), + "yes" => Some(Box::new(Yes::default())), _ => None, } } -pub static COMMANDS: [&'static str; 15] = [ +pub static COMMANDS: [&'static str; 16] = [ "base32", "base64", "bootstrap", @@ -79,4 +82,5 @@ pub static COMMANDS: [&'static str; 15] = [ "sleep", "shitbox", "true", + "yes", ]; diff --git a/src/cmd/rev/mod.rs b/src/cmd/rev/mod.rs index c0234e4..e4cce80 100644 --- a/src/cmd/rev/mod.rs +++ b/src/cmd/rev/mod.rs @@ -1,5 +1,5 @@ use crate::Cmd; -use clap::{Arg, Command, ArgAction}; +use clap::{Arg, ArgAction, Command}; use std::{ fs::File, io::{self, BufRead, BufReader, ErrorKind, Write}, diff --git a/src/cmd/yes/mod.rs b/src/cmd/yes/mod.rs new file mode 100644 index 0000000..76942f4 --- /dev/null +++ b/src/cmd/yes/mod.rs @@ -0,0 +1,45 @@ +use super::Cmd; +use clap::{Arg, Command}; +use std::io; + +#[derive(Debug)] +pub struct Yes { + name: &'static str, + path: Option, +} + +impl Default for Yes { + fn default() -> Self { + Self { + name: "yes", + path: Some(crate::Path::UsrBin), + } + } +} + +impl Cmd for Yes { + fn name(&self) -> &str { + self.name + } + + fn cli(&self) -> clap::Command { + Command::new(self.name) + .about("output a string repeatedly until killed") + .author("Nathan Fisher") + .arg(Arg::new("msg").num_args(1).default_value("y")) + } + + fn run(&self, matches: Option<&clap::ArgMatches>) -> Result<(), Box> { + let Some(matches) = matches else { + return Err(Box::new(io::Error::new(io::ErrorKind::Other, "no input"))); + }; + let msg = matches.get_one::("msg").unwrap(); + loop { + println!("{msg}"); + } + } + + fn path(&self) -> Option { + self.path + } +}