use std::collections::HashMap;
use std::ffi::OsStr;
use std::fmt::Display;
#[derive(Default, Debug, Clone)]
pub struct CommandConfig {
pub(crate) args: Vec<String>,
pub(crate) envs: HashMap<String, String>,
}
impl CommandConfig {
pub fn set_system_envs(&mut self) -> &mut Self {
self.envs = std::env::vars().collect();
self
}
pub fn add_env(&mut self, key: impl Into<String>, value: impl Into<String>) -> &mut Self {
self.envs.insert(key.into(), value.into());
self
}
pub fn filter_envs<T, S>(&mut self, iter: T) -> &mut Self
where
T: IntoIterator<Item = S>,
S: AsRef<OsStr> + Display,
{
let filtered_envs: HashMap<String, String> = iter
.into_iter()
.filter_map(|env| {
let key = env.to_string();
self.envs.get(&key).map(|val| (key, val.clone()))
})
.collect();
self.envs = filtered_envs;
self
}
pub fn arg<S: AsRef<OsStr> + Display>(&mut self, arg: S) -> &mut Self {
self.args.push(arg.to_string());
self
}
pub fn args<T, S>(&mut self, args: T) -> &mut Self
where
T: IntoIterator<Item = S>,
S: AsRef<OsStr> + Display,
{
self.args.extend(args.into_iter().map(|arg| arg.to_string()));
self
}
pub fn clear_args(&mut self) -> &mut Self {
self.args.clear();
self
}
pub fn clear_envs(&mut self) -> &mut Self {
self.envs.clear();
self
}
pub fn get_args(&self) -> &[String] {
&self.args
}
pub fn get_envs(&self) -> &HashMap<String, String> {
&self.envs
}
}