use crate::ported::exec_hooks::dispatch_function_call;
use crate::ported::params::{getsparam, setsparam, unsetparam};
pub fn _generic(args: &[String]) -> i32 {
let trace_widget = getsparam("ZSH_TRACE_GENERIC_WIDGET").unwrap_or_default();
if !trace_widget.is_empty() {
unsetparam("ZSH_TRACE_GENERIC_WIDGET");
return dispatch_function_call(&trace_widget, &["_generic".to_string()]).unwrap_or(1);
}
let saved = getsparam("curcontext").unwrap_or_default();
let widget = getsparam("WIDGET").unwrap_or_default();
let new_ctx = if saved.is_empty() {
format!("{}:::", widget)
} else {
let tail = saved.splitn(2, ':').nth(1).unwrap_or("");
format!("{}:{}", widget, tail)
};
let _ = setsparam("curcontext", &new_ctx);
let r = dispatch_function_call("_main_complete", args).unwrap_or(1);
let _ = setsparam("curcontext", &saved);
r
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn returns_one_without_executor() {
let _g = crate::test_util::global_state_lock();
let _ = setsparam("ZSH_TRACE_GENERIC_WIDGET", "");
let _ = setsparam("WIDGET", "some-widget");
assert_eq!(_generic(&[]), 1);
}
#[test]
fn trace_widget_clears_env_and_dispatches_named_widget() {
let _g = crate::test_util::global_state_lock();
let _ = setsparam("ZSH_TRACE_GENERIC_WIDGET", "_complete_debug");
let _ = _generic(&[]);
let after = getsparam("ZSH_TRACE_GENERIC_WIDGET").unwrap_or_default();
assert!(after.is_empty());
}
}