Skip to main content

luaur_require/methods/
runtime_navigation_context_get_string_from_c_writer.rs

1use crate::enums::luarequire_write_result::luarequire_WriteResult;
2use crate::records::runtime_navigation_context::RuntimeNavigationContext;
3use core::ffi::{c_char, c_void};
4
5impl RuntimeNavigationContext {
6    pub fn get_string_from_c_writer(
7        &self,
8        writer: extern "C" fn(
9            *mut c_void,
10            *mut c_void,
11            *mut c_char,
12            usize,
13            *mut usize,
14        ) -> luarequire_WriteResult,
15        initial_buffer_size: usize,
16    ) -> Option<alloc::string::String> {
17        let mut buffer = alloc::vec::Vec::new();
18        buffer.resize(initial_buffer_size, 0);
19
20        let mut size: usize = 0;
21        let result = unsafe {
22            writer(
23                self.l as *mut c_void,
24                self.ctx as *mut c_void,
25                buffer.as_mut_ptr() as *mut c_char,
26                buffer.len(),
27                &mut size,
28            )
29        };
30
31        if result == luarequire_WriteResult::WRITE_BUFFER_TOO_SMALL {
32            buffer.resize(size, 0);
33            let mut size2: usize = 0;
34            let result2 = unsafe {
35                writer(
36                    self.l as *mut c_void,
37                    self.ctx as *mut c_void,
38                    buffer.as_mut_ptr() as *mut c_char,
39                    buffer.len(),
40                    &mut size2,
41                )
42            };
43            if result2 == luarequire_WriteResult::WRITE_SUCCESS {
44                // `size` is the null-terminated size; exclude the trailing NUL.
45                buffer.truncate(size2.saturating_sub(1));
46                return alloc::string::String::from_utf8(buffer).ok();
47            }
48        } else if result == luarequire_WriteResult::WRITE_SUCCESS {
49            // `size` is the null-terminated size; exclude the trailing NUL.
50            buffer.truncate(size.saturating_sub(1));
51            return alloc::string::String::from_utf8(buffer).ok();
52        }
53
54        None
55    }
56}