Skip to main content

luaur_repl_cli/functions/
get_cache_key.rs

1use core::ffi::{c_char, c_void};
2use luaur_code_gen::type_aliases::lua_state::lua_State;
3
4use crate::functions::write::{luarequire_WriteResult, write};
5use crate::records::repl_requirer::ReplRequirer;
6
7pub unsafe fn get_cache_key(
8    _L: *mut lua_State,
9    ctx: *mut c_void,
10    buffer: *mut c_char,
11    buffer_size: usize,
12    size_out: *mut usize,
13) -> luarequire_WriteResult {
14    if ctx.is_null() {
15        return luarequire_WriteResult::WRITE_FAILURE;
16    }
17
18    let req = &*(ctx as *const ReplRequirer);
19    let path = req.vfs.get_absolute_file_path();
20    let path_cstr = path.as_bytes();
21    let null_terminated_size = path_cstr.len() + 1;
22
23    if buffer_size < null_terminated_size {
24        if !size_out.is_null() {
25            *size_out = null_terminated_size;
26        }
27        return luarequire_WriteResult::WRITE_BUFFER_TOO_SMALL;
28    }
29
30    if !buffer.is_null() {
31        let src = path_cstr;
32        let dst = core::slice::from_raw_parts_mut(buffer as *mut u8, null_terminated_size);
33        dst[..src.len()].copy_from_slice(src);
34        dst[src.len()] = 0;
35    }
36
37    if !size_out.is_null() {
38        *size_out = null_terminated_size;
39    }
40
41    luarequire_WriteResult::WRITE_SUCCESS
42}