use std::collections::HashSet;
use crate::lua;
pub struct OpenClose {
pub priority: i32, pub id: &'static str,
pub open: fn(lua::State),
pub close: fn(lua::State),
}
pub const fn new(
priority: i32,
id: &'static str,
open: fn(lua::State),
close: fn(lua::State),
) -> OpenClose {
OpenClose {
priority,
id,
open,
close,
}
}
inventory::collect!(OpenClose);
fn get_sorted_modules() -> Vec<&'static OpenClose> {
let mut modules: Vec<&OpenClose> = inventory::iter::<OpenClose>().collect();
let mut seen_ids = HashSet::new();
for module in &modules {
if !seen_ids.insert(module.id) {
panic!("Duplicate OpenClose ID: {}", module.id);
}
}
modules.sort_by_key(|m| (m.priority, m.id));
modules
}
#[allow(unused)]
pub fn load_all(l: lua::State) {
let modules = get_sorted_modules();
for module in &modules {
(module.open)(l);
#[cfg(debug_assertions)]
println!(
"[gmodx] Loaded OpenClose '{}' (priority: {})",
module.id, module.priority
);
}
}
#[allow(unused)]
pub fn unload_all(l: lua::State) {
let modules = get_sorted_modules();
for module in modules.iter().rev() {
#[cfg(debug_assertions)]
println!(
"[gmodx] Unloaded OpenClose '{}' (priority: {})",
module.id, module.priority
);
(module.close)(l);
}
}