use crate::ExecStatus;
use crate::builtins::BashBuiltin;
pub fn declare<I>(args: I) -> crate::Result<ExecStatus>
where
I: IntoIterator,
I::Item: AsRef<str>,
{
BashBuiltin::find("declare")?.call(args)
}
pub fn local<I>(args: I) -> crate::Result<ExecStatus>
where
I: IntoIterator,
I::Item: AsRef<str>,
{
BashBuiltin::find("local")?.call(args)
}
pub fn set<I>(args: I) -> crate::Result<ExecStatus>
where
I: IntoIterator,
I::Item: AsRef<str>,
{
BashBuiltin::find("set")?.call(args)
}
pub fn shopt<I>(args: I) -> crate::Result<ExecStatus>
where
I: IntoIterator,
I::Item: AsRef<str>,
{
BashBuiltin::find("shopt")?.call(args)
}
#[cfg(test)]
mod tests {
use crate::functions::bash_func;
use crate::variables::{bind, optional};
#[test]
fn declare() {
assert!(super::declare(["-Z", "foo"]).is_err());
assert!(super::declare(["-a", "foo"]).is_ok());
}
#[test]
fn local() {
bind("VAR", "outer", None, None).unwrap();
bash_func("func_name", || {
let result = super::local(["VAR=inner"]);
assert_eq!(optional("VAR").unwrap(), "inner");
result
})
.unwrap();
assert_eq!(optional("VAR").unwrap(), "outer");
assert!(super::local(["VAR=inner"]).is_err());
}
#[test]
fn set() {
assert!(super::set(["-o", "foo"]).is_err());
assert!(super::set(["-o", "errexit"]).is_ok());
assert!(super::set(["+e"]).is_ok());
}
#[test]
fn shopt() {
assert!(super::shopt(["-s", "foo"]).is_err());
assert!(super::shopt(["-s", "failglob"]).is_ok());
assert!(super::shopt(["-u", "failglob"]).is_ok());
}
}