use anyhow::Result;
use clap::{
Arg,
ArgMatches,
Command,
};
#[derive(Debug)]
pub struct ProgramArguments {
pipe_name: String,
niterations: usize,
peer_type: String,
}
impl ProgramArguments {
pub fn new(app_name: &'static str, app_author: &'static str, app_about: &'static str) -> Result<Self> {
let matches: ArgMatches = Command::new(app_name)
.author(app_author)
.about(app_about)
.arg(
Arg::new("pipe-name")
.long("pipe-name")
.value_parser(clap::value_parser!(String))
.required(true)
.value_name("NAME")
.help("Sets pipename"),
)
.arg(
Arg::new("peer")
.long("peer")
.value_parser(clap::value_parser!(String))
.required(true)
.value_name("server|client")
.default_value("server")
.help("Sets peer type"),
)
.arg(
Arg::new("niterations")
.long("niterations")
.value_parser(clap::value_parser!(usize))
.required(false)
.value_name("NUMBER")
.help("Sets number of clients"),
)
.get_matches();
let pipe_name: String = matches
.get_one::<String>("pipe-name")
.ok_or(anyhow::anyhow!("missing pipe_nameess"))?
.to_string();
let niterations: usize = *matches
.get_one::<usize>("niterations")
.ok_or(anyhow::anyhow!("missing niterations"))?;
if niterations == 0 {
anyhow::bail!("invalid niterations");
}
let peer_type: String = matches
.get_one::<String>("peer")
.ok_or(anyhow::anyhow!("missing peer type"))?
.to_string();
Ok(Self {
pipe_name,
niterations,
peer_type,
})
}
pub fn pipe_name(&self) -> String {
self.pipe_name.clone()
}
pub fn niterations(&self) -> usize {
self.niterations
}
pub fn peer_type(&self) -> String {
self.peer_type.clone()
}
}