use crate::ported::exec::dispatch_function_call;
use crate::ported::params::{getaparam, getsparam, setaparam, setsparam};
pub fn _as_if(args: &[String]) -> i32 {
let _fn_scope = crate::compsys::ported::shared::FnScope::enter("_as_if");
let saved_words = getaparam("words").unwrap_or_default();
let saved_current = getsparam("CURRENT").unwrap_or_default();
crate::compsys::ported::shared::declare_locals(
&["_comp_command1", "_comp_command2", "_comp_command"],
0,
);
let mut new_words: Vec<String> = args.to_vec();
if saved_words.len() > 1 {
new_words.extend(saved_words.iter().skip(1).cloned());
}
setaparam("words", new_words);
let cur: i64 = saved_current.parse().unwrap_or(0);
let new_current = cur + (args.len() as i64) - 1;
let _ = setsparam("CURRENT", &new_current.to_string());
let _ = dispatch_function_call("_set_command", &[]);
let cmd = getsparam("_comp_command").unwrap_or_default();
let cmd1 = getsparam("_comp_command1").unwrap_or_default();
let cmd2 = getsparam("_comp_command2").unwrap_or_default();
let r = dispatch_function_call("_dispatch", &[cmd, cmd1, cmd2, "-default-".to_string()])
.unwrap_or(1);
setaparam("words", saved_words);
let _ = setsparam("CURRENT", &saved_current);
r
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn returns_one_without_executor() {
let _g = crate::test_util::global_state_lock();
assert_eq!(_as_if(&["foo".to_string()]), 1);
}
#[test]
fn restores_words_and_current_after_call() {
let _g = crate::test_util::global_state_lock();
setaparam("words", vec!["original".to_string()]);
let _ = setsparam("CURRENT", "5");
let _ = _as_if(&["replacement".to_string()]);
assert_eq!(getaparam("words").unwrap_or_default(), vec!["original"]);
assert_eq!(getsparam("CURRENT").as_deref(), Some("5"));
}
}