luaur_require/methods/
runtime_navigation_context_get_string_from_c_writer.rs1use 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 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 buffer.truncate(size.saturating_sub(1));
51 return alloc::string::String::from_utf8(buffer).ok();
52 }
53
54 None
55 }
56}