Skip to main content

luaur_require/functions/
pushrequireclosureinternal.rs

1use crate::functions::lua_requirecont::lua_requirecont;
2use crate::functions::validate_config::validate_config;
3use crate::records::luarequire_configuration::luarequire_Configuration;
4use crate::type_aliases::luarequire_configuration_init::luarequire_Configuration_init;
5use core::ffi::{c_char, c_void};
6use luaur_vm::functions::lua_pushcclosurek::lua_pushcclosurek;
7use luaur_vm::macros::lua_l_error::luaL_error;
8use luaur_vm::macros::lua_newuserdata::lua_newuserdata;
9use luaur_vm::macros::lua_pushlightuserdata::lua_pushlightuserdata;
10use luaur_vm::records::lua_state::lua_State;
11use luaur_vm::type_aliases::lua_c_function::lua_CFunction;
12
13pub fn pushrequireclosureinternal(
14    l: *mut lua_State,
15    config_init: luarequire_Configuration_init,
16    ctx: *mut c_void,
17    requirelikefunc: lua_CFunction,
18    debugname: *const c_char,
19) -> i32 {
20    unsafe {
21        let ud = lua_newuserdata(l, core::mem::size_of::<luarequire_Configuration>());
22        if ud.is_null() {
23            luaL_error!(l, "failed to allocate memory for require configuration");
24            return 0;
25        }
26
27        let config = ud as *mut luarequire_Configuration;
28        core::ptr::write(config, core::mem::zeroed());
29
30        let Some(config_init) = config_init else {
31            luaL_error!(
32                l,
33                "require configuration is missing required initializer function"
34            );
35            return 0;
36        };
37
38        config_init(config);
39        validate_config(l, &*config);
40
41        lua_pushlightuserdata(l as *mut c_void, ctx);
42        lua_pushcclosurek(l, requirelikefunc, debugname, 2, Some(lua_requirecont));
43        1
44    }
45}