use crate::Command;
use alloc::format;
use core::fmt::Display;
pub trait CommandExt {
fn option(&mut self, name: &str, value: Option<impl Display>) -> &mut Self;
}
impl CommandExt for Command {
fn option(&mut self, name: &str, value: Option<impl Display>) -> &mut Self {
if let Some(value) = value {
self.arg(format!("--{name}={value}"));
}
self
}
}
#[cfg(test)]
mod tests {
use super::*;
use alloc::vec::Vec;
#[test]
fn preserves_explicit_values_argument_boundaries_and_order() {
let mut command = Command::new("asimov-test-program");
command
.arg("first")
.option("missing", None::<&str>)
.option("offset", Some(0))
.option("enabled", Some(false))
.option("empty", Some(""))
.option("literal", Some("café a=b; '$HOME'\nnext"))
.option("repeat", Some(1))
.option("repeat", Some(2))
.arg("last");
let args: Vec<_> = command.as_std().get_args().collect();
assert_eq!(
args,
[
"first",
"--offset=0",
"--enabled=false",
"--empty=",
"--literal=café a=b; '$HOME'\nnext",
"--repeat=1",
"--repeat=2",
"last",
]
);
}
}