lua_shared/
dump.rs

1use std::ffi::c_void;
2
3use crate::{lua_State, lua_dump, LError};
4
5// TODO: Make better writer error handling.
6pub unsafe fn dump<WRITER>(
7    state: lua_State,
8    buffer_writer: &mut WRITER,
9) -> std::result::Result<(), LError>
10where
11    WRITER: std::io::Write,
12{
13    unsafe extern "C" fn writer_callback<WRITER>(
14        _: lua_State,
15        data: *const u8,
16        size: usize,
17        userdata: *mut c_void,
18    ) -> i32
19    where
20        WRITER: std::io::Write,
21    {
22        let writer = &mut *userdata.cast::<WRITER>();
23        match writer.write_all(std::slice::from_raw_parts(data, size)) {
24            Ok(_) => 0,
25            Err(_) => 1,
26        }
27    }
28    match lua_dump(
29        state,
30        writer_callback::<WRITER>,
31        buffer_writer as *mut WRITER as _,
32    ) {
33        0 => Ok(()),
34        any @ _ => Err(LError::DumpError(any)),
35    }
36}