luaur_require/functions/
pushrequireclosureinternal.rs1use 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}