Работа с c_void в FFI
Я борюсь с передачей структуры через FFI, которая принимает void, и читаю ее обратно на другом конце.
Рассматриваемая библиотека - libtsm, конечный автомат. Это позволяет вам вводить ввод, а затем выяснять, в каком состоянии будет терминал после ввода.
Он объявляет свою функцию рисования как:
pub fn tsm_screen_draw(con: *tsm_screen, draw_cb: tsm_screen_draw_cb, data: *mut c_void) -> tsm_age_t;
где tsm_screen_draw_cb - обратный вызов, который должен быть реализован пользователем библиотеки, с подписью:
pub type tsm_screen_draw_cb = extern "C" fn(
con: *tsm_screen,
id: u32,
ch: *const uint32_t,
len: size_t,
width: uint,
posx: uint,
posy: uint,
attr: *tsm_screen_attr,
age: tsm_age_t,
data: *mut c_void
);
Важной частью здесь являетсяdata
параметр. Это позволяет пользователю проходить через указатель к самореализуемому состоянию, манипулировать им и использовать его после рисования. Учитывая простую структуру:
struct State {
state: int
}
как бы я сделал это правильно? Я не уверен, как правильно привести указатель на структуру void и обратно.