#[derive(Debug, Clone)]
pub struct ShellOptions {
pub errexit: bool,
pub nounset: bool,
pub xtrace: bool,
pub verbose: bool,
pub noexec: bool,
pub noglob: bool,
pub noclobber: bool,
pub allexport: bool,
pub notify: bool,
pub ignoreeof: bool,
pub monitor: bool,
}
impl Default for ShellOptions {
fn default() -> Self {
Self {
errexit: false,
nounset: false,
xtrace: false,
verbose: false,
noexec: false,
noglob: false,
noclobber: false,
allexport: false,
notify: false,
ignoreeof: false,
monitor: false,
}
}
}
impl ShellOptions {
#[allow(dead_code)]
pub fn get_by_short_name(&self, name: char) -> Option<bool> {
match name {
'e' => Some(self.errexit),
'u' => Some(self.nounset),
'x' => Some(self.xtrace),
'v' => Some(self.verbose),
'n' => Some(self.noexec),
'f' => Some(self.noglob),
'C' => Some(self.noclobber),
'a' => Some(self.allexport),
'b' => Some(self.notify),
'm' => Some(self.monitor),
_ => None,
}
}
pub fn set_by_short_name(&mut self, name: char, value: bool) -> Result<(), String> {
match name {
'e' => {
self.errexit = value;
Ok(())
}
'u' => {
self.nounset = value;
Ok(())
}
'x' => {
self.xtrace = value;
Ok(())
}
'v' => {
self.verbose = value;
Ok(())
}
'n' => {
self.noexec = value;
Ok(())
}
'f' => {
self.noglob = value;
Ok(())
}
'C' => {
self.noclobber = value;
Ok(())
}
'a' => {
self.allexport = value;
Ok(())
}
'b' => {
self.notify = value;
Ok(())
}
'm' => {
self.monitor = value;
Ok(())
}
_ => Err(format!("Invalid option: -{}", name)),
}
}
#[allow(dead_code)]
pub fn get_by_long_name(&self, name: &str) -> Option<bool> {
match name {
"errexit" => Some(self.errexit),
"nounset" => Some(self.nounset),
"xtrace" => Some(self.xtrace),
"verbose" => Some(self.verbose),
"noexec" => Some(self.noexec),
"noglob" => Some(self.noglob),
"noclobber" => Some(self.noclobber),
"allexport" => Some(self.allexport),
"notify" => Some(self.notify),
"ignoreeof" => Some(self.ignoreeof),
"monitor" => Some(self.monitor),
_ => None,
}
}
pub fn set_by_long_name(&mut self, name: &str, value: bool) -> Result<(), String> {
match name {
"errexit" => {
self.errexit = value;
Ok(())
}
"nounset" => {
self.nounset = value;
Ok(())
}
"xtrace" => {
self.xtrace = value;
Ok(())
}
"verbose" => {
self.verbose = value;
Ok(())
}
"noexec" => {
self.noexec = value;
Ok(())
}
"noglob" => {
self.noglob = value;
Ok(())
}
"noclobber" => {
self.noclobber = value;
Ok(())
}
"allexport" => {
self.allexport = value;
Ok(())
}
"notify" => {
self.notify = value;
Ok(())
}
"ignoreeof" => {
self.ignoreeof = value;
Ok(())
}
"monitor" => {
self.monitor = value;
Ok(())
}
_ => Err(format!("Invalid option: {}", name)),
}
}
pub fn get_all_options(&self) -> Vec<(&'static str, char, bool)> {
vec![
("allexport", 'a', self.allexport),
("notify", 'b', self.notify),
("noclobber", 'C', self.noclobber),
("errexit", 'e', self.errexit),
("noglob", 'f', self.noglob),
("monitor", 'm', self.monitor),
("noexec", 'n', self.noexec),
("nounset", 'u', self.nounset),
("verbose", 'v', self.verbose),
("xtrace", 'x', self.xtrace),
("ignoreeof", '\0', self.ignoreeof), ]
}
}