bloqade_lanes_bytecode/ffi/
arch.rs

1use 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/// Parse and validate an architecture spec from JSON (null-terminated UTF-8).
10#[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/// Free an ArchSpec handle.
45#[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}