bloqade_lanes_bytecode/ffi/
arch.rs1use std::ffi::CStr;
2use std::os::raw::c_char;
3
4use bloqade_lanes_bytecode_core::arch::ArchSpec;
5
6use super::error::{BlqdStatus, clear_last_error, set_last_error};
7use super::handles::BLQDArchSpec;
8
9#[unsafe(no_mangle)]
11pub unsafe extern "C" fn blqd_arch_from_json(
12 json: *const c_char,
13 out: *mut *mut BLQDArchSpec,
14) -> BlqdStatus {
15 clear_last_error();
16
17 if json.is_null() || out.is_null() {
18 set_last_error("null pointer argument");
19 return BlqdStatus::ErrNullPtr;
20 }
21
22 let c_str = unsafe { CStr::from_ptr(json) };
23 let json_str = match c_str.to_str() {
24 Ok(s) => s,
25 Err(e) => {
26 set_last_error(format!("invalid UTF-8: {}", e));
27 return BlqdStatus::ErrIo;
28 }
29 };
30
31 match ArchSpec::from_json(json_str) {
32 Ok(spec) => {
33 let handle = Box::new(BLQDArchSpec { inner: spec });
34 unsafe { *out = Box::into_raw(handle) };
35 BlqdStatus::Ok
36 }
37 Err(e) => {
38 set_last_error(e.to_string());
39 BlqdStatus::ErrJson
40 }
41 }
42}
43
44#[unsafe(no_mangle)]
46pub unsafe extern "C" fn blqd_arch_free(arch: *mut BLQDArchSpec) {
47 if !arch.is_null() {
48 drop(unsafe { Box::from_raw(arch) });
49 }
50}