use crate::compsys::ported::shared::dispatch_action_command;
use crate::ported::params::getsparam;
pub fn _in_vared() -> i32 {
let _fn_scope = crate::compsys::ported::shared::FnScope::enter("_in_vared");
let vared = crate::ported::params::getsparam("compstate[vared]").unwrap_or_default();
let also: String;
if vared.contains('[') {
if vared.contains(']') {
let head = vared.splitn(2, ']').next().unwrap_or("").replace('[', "-");
let _ = crate::ported::params::setsparam("compstate[parameter]", &head);
let _ = crate::ported::params::setsparam("compstate[context]", "value");
also = "-value-".to_string();
} else {
let head = vared.splitn(2, '[').next().unwrap_or("");
let _ = crate::ported::params::setsparam("compstate[parameter]", head);
let _ = crate::ported::params::setsparam("compstate[context]", "value");
also = "-value-".to_string();
}
} else {
let _ = crate::ported::params::setsparam("compstate[parameter]", &vared);
let raw_type = param_type(&vared);
if raw_type.contains("array") || raw_type.contains("assoc") {
let _ = crate::ported::params::setsparam("compstate[context]", "array_value");
also = "-array-value-".to_string();
} else {
let _ = crate::ported::params::setsparam("compstate[context]", "value");
also = "-value-".to_string();
}
}
let insert = crate::ported::params::getsparam("compstate[insert]").unwrap_or_default();
let cleaned = insert.replace("tab ", "");
let _ = crate::ported::params::setsparam("compstate[insert]", &cleaned);
dispatch_action_command("_dispatch", &[also.clone(), also], 35)
}
fn param_type(name: &str) -> String {
if crate::ported::params::getaparam(name).is_some() {
"array".to_string()
} else if getsparam(name).is_some() {
"scalar".to_string()
} else {
String::new()
}
}
#[cfg(test)]
mod tests {
use super::*;
use crate::ported::params::setaparam;
#[test]
fn unresolvable_command_word_reports_not_found() {
let _g = crate::test_util::global_state_lock();
let _ = crate::ported::params::setsparam("compstate[vared]", "myvar");
assert_eq!(_in_vared(), 127);
}
#[test]
fn array_param_sets_array_value_context() {
let _g = crate::test_util::global_state_lock();
let _scope = crate::test_util::comp_scope();
setaparam("myarr", vec!["a".to_string(), "b".to_string()]);
let _ = crate::ported::params::setsparam("compstate[vared]", "myarr");
let _ = _in_vared();
assert_eq!(crate::ported::params::getsparam("compstate[context]").as_deref(), Some("array_value"));
}
#[test]
fn bracketed_vared_uses_value_context() {
let _g = crate::test_util::global_state_lock();
let _scope = crate::test_util::comp_scope();
let _ = crate::ported::params::setsparam("compstate[vared]", "myarr[key]");
let _ = _in_vared();
assert_eq!(crate::ported::params::getsparam("compstate[context]").as_deref(), Some("value"));
assert_eq!(crate::ported::params::getsparam("compstate[parameter]").as_deref(), Some("myarr-key"));
}
#[test]
fn param_type_returns_array_when_array_set() {
let _g = crate::test_util::global_state_lock();
setaparam("arr_x", vec!["a".to_string(), "b".to_string()]);
assert_eq!(param_type("arr_x"), "array");
}
#[test]
fn param_type_returns_scalar_when_only_scalar_set() {
let _g = crate::test_util::global_state_lock();
crate::ported::params::unsetparam("scal_x");
let _ = crate::ported::params::setsparam("scal_x", "hello");
assert_eq!(param_type("scal_x"), "scalar");
}
#[test]
fn param_type_returns_empty_for_unset_name() {
let _g = crate::test_util::global_state_lock();
crate::ported::params::unsetparam("never_set_param_ever");
assert_eq!(param_type("never_set_param_ever"), "");
}
#[test]
fn half_bracket_vared_strips_array_subscript_prefix() {
let _g = crate::test_util::global_state_lock();
let _scope = crate::test_util::comp_scope();
let _ = crate::ported::params::setsparam("compstate[vared]", "arr[partial");
let _ = _in_vared();
assert_eq!(crate::ported::params::getsparam("compstate[context]").as_deref(), Some("value"));
assert_eq!(crate::ported::params::getsparam("compstate[parameter]").as_deref(), Some("arr"));
}
#[test]
fn scalar_param_sets_value_context_not_array_value() {
let _g = crate::test_util::global_state_lock();
let _scope = crate::test_util::comp_scope();
crate::ported::params::unsetparam("scalar_param_for_context");
let _ = crate::ported::params::setsparam("scalar_param_for_context", "x");
let _ = crate::ported::params::setsparam("compstate[vared]", "scalar_param_for_context");
let _ = _in_vared();
assert_eq!(crate::ported::params::getsparam("compstate[context]").as_deref(), Some("value"));
}
#[test]
fn unset_param_falls_into_scalar_value_branch() {
let _g = crate::test_util::global_state_lock();
let _scope = crate::test_util::comp_scope();
crate::ported::params::unsetparam("doesnt_exist_anywhere");
let _ = crate::ported::params::setsparam("compstate[vared]", "doesnt_exist_anywhere");
let _ = _in_vared();
assert_eq!(crate::ported::params::getsparam("compstate[context]").as_deref(), Some("value"));
}
#[test]
fn vared_empty_string_sets_value_context() {
let _g = crate::test_util::global_state_lock();
let _scope = crate::test_util::comp_scope();
crate::ported::params::unsetparam("");
let _ = crate::ported::params::setsparam("compstate[vared]", "");
let _ = _in_vared();
assert_eq!(crate::ported::params::getsparam("compstate[context]").as_deref(), Some("value"));
}
#[test]
fn insert_field_has_tab_token_stripped() {
let _g = crate::test_util::global_state_lock();
let _scope = crate::test_util::comp_scope();
let _ = crate::ported::params::setsparam("compstate[vared]", "");
let _ = crate::ported::params::setsparam("compstate[insert]", "tab menu");
let _ = _in_vared();
assert_eq!(crate::ported::params::getsparam("compstate[insert]").as_deref(), Some("menu"));
}
#[test]
fn insert_field_without_tab_unchanged() {
let _g = crate::test_util::global_state_lock();
let _scope = crate::test_util::comp_scope();
let _ = crate::ported::params::setsparam("compstate[vared]", "");
let _ = crate::ported::params::setsparam("compstate[insert]", "menu only");
let _ = _in_vared();
assert_eq!(crate::ported::params::getsparam("compstate[insert]").as_deref(), Some("menu only"));
}
#[test]
fn bracketed_with_close_inverts_brackets_to_dash() {
let _g = crate::test_util::global_state_lock();
let _scope = crate::test_util::comp_scope();
let _ = crate::ported::params::setsparam("compstate[vared]", "outer[inner]extra]");
let _ = _in_vared();
assert_eq!(
crate::ported::params::getsparam("compstate[parameter]").as_deref(),
Some("outer-inner")
);
}
}