use core::ffi::{c_char, c_void};
pub const CODE_ABI_VERSION: u32 = 2;
pub const CODE_EMIT_TARGET_BASE: u32 = 0;
pub const CODE_TAG_NUMBER: u8 = 0;
pub const CODE_TAG_STRING: u8 = 1;
pub const CODE_TAG_BOOLEAN: u8 = 2;
pub const CODE_TAG_OBJECT: u8 = 3;
pub const CODE_TAG_NULL: u8 = 4;
pub const CODE_TAG_ARRAY: u8 = 5;
#[repr(C)]
pub struct CodeValue {
pub tag: u8,
pub number: f64,
pub string: *const c_char,
pub boolean: u8,
pub fields: *const CodeField,
pub field_count: u32,
pub elements: *const CodeValue,
pub element_count: u32,
}
impl CodeValue {
pub fn null() -> Self {
CodeValue {
tag: CODE_TAG_NULL,
number: 0.0,
string: core::ptr::null(),
boolean: 0,
fields: core::ptr::null(),
field_count: 0,
elements: core::ptr::null(),
element_count: 0,
}
}
}
#[repr(C)]
pub struct CodeField {
pub name: *const c_char,
pub value: CodeValue,
}
pub type CodeNativeHandlerFn = unsafe extern "C" fn(particle: CodeValue) -> CodeValue;
pub type CodeEmitFn = unsafe extern "C" fn(context: *mut c_void, particle: CodeValue);
#[repr(C)]
pub struct CodeExportVar {
pub name: *const c_char,
pub value: CodeValue,
}
#[repr(C)]
pub struct CodeExportHandler {
pub class_name: *const c_char,
pub handler: CodeNativeHandlerFn,
}
#[repr(C)]
pub struct CodeTypeField {
pub name: *const c_char,
pub type_name: *const c_char,
pub is_optional: u8,
}
#[repr(C)]
pub struct CodeExportType {
pub name: *const c_char,
pub fields: *const CodeTypeField,
pub field_count: u32,
}
#[repr(C)]
pub struct CodeEmission {
pub class_name: *const c_char,
pub target: u32,
}
#[repr(C)]
pub struct CodeModuleDesc {
pub abi_version: u32,
pub vars: *const CodeExportVar,
pub var_count: u32,
pub handlers: *const CodeExportHandler,
pub handler_count: u32,
pub types: *const CodeExportType,
pub type_count: u32,
pub emissions: *const CodeEmission,
pub emission_count: u32,
}
unsafe impl Sync for CodeValue {}
unsafe impl Send for CodeValue {}
unsafe impl Sync for CodeField {}
unsafe impl Send for CodeField {}
unsafe impl Sync for CodeExportVar {}
unsafe impl Send for CodeExportVar {}
unsafe impl Sync for CodeExportHandler {}
unsafe impl Send for CodeExportHandler {}
unsafe impl Sync for CodeTypeField {}
unsafe impl Send for CodeTypeField {}
unsafe impl Sync for CodeExportType {}
unsafe impl Send for CodeExportType {}
unsafe impl Sync for CodeEmission {}
unsafe impl Send for CodeEmission {}
unsafe impl Sync for CodeModuleDesc {}
unsafe impl Send for CodeModuleDesc {}