use core::ffi::c_void;
use core::mem::MaybeUninit;
pub const GENERIC_PLUGIN_ABI_VERSION: u32 = 1;
#[repr(C)]
#[derive(Clone, Copy)]
pub struct GenericValue {
pub opaque: [MaybeUninit<u64>; 4],
}
impl core::fmt::Debug for GenericValue {
fn fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result {
f.debug_struct("GenericValue").finish_non_exhaustive()
}
}
#[repr(C)]
#[derive(Debug, Clone, Copy)]
pub struct FfiStr {
pub ptr: *const u8,
pub len: usize,
}
impl FfiStr {
#[must_use]
pub const fn null() -> Self {
Self {
ptr: core::ptr::null(),
len: 0,
}
}
}
#[repr(u32)]
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum FfiStatus {
Ok = 0,
Exception = 1,
Fatal = 99,
}
impl FfiStatus {
#[must_use]
pub const fn from_u32(status: u32) -> Option<Self> {
match status {
0 => Some(Self::Ok),
1 => Some(Self::Exception),
99 => Some(Self::Fatal),
_ => None,
}
}
}
#[repr(C)]
#[derive(Debug, Clone, Copy)]
pub struct FfiReturn {
pub status: u32,
pub value: GenericValue,
}
pub type PluginFn =
extern "C" fn(host: *const HostApi, args: *const GenericValue, nargs: usize) -> FfiReturn;
#[repr(C)]
pub struct FunctionDesc {
pub name: FfiStr,
pub arities: *const u8,
pub arities_len: usize,
pub fun: Option<
extern "C" fn(host: *const HostApi, args: *const GenericValue, nargs: usize) -> FfiReturn,
>,
}
pub type PluginVisitFn = extern "C" fn(ctx: *mut c_void, value: GenericValue);
pub type PluginTraverseFn =
extern "C" fn(opaque_ptr: *mut c_void, visit: PluginVisitFn, visit_ctx: *mut c_void) -> i32;
pub type PluginValueFn = extern "C" fn(host: *const HostApi) -> FfiReturn;
#[repr(C)]
pub struct ValueDesc {
pub name: FfiStr,
pub fun: Option<extern "C" fn(host: *const HostApi) -> FfiReturn>,
}
pub type PluginMethodFn = extern "C" fn(
host: *const HostApi,
receiver: GenericValue,
args: *const GenericValue,
nargs: usize,
) -> FfiReturn;
#[repr(C)]
pub struct MethodDesc {
pub name: FfiStr,
pub arities: *const u8,
pub arities_len: usize,
pub fun: Option<
extern "C" fn(
host: *const HostApi,
receiver: GenericValue,
args: *const GenericValue,
nargs: usize,
) -> FfiReturn,
>,
}
#[repr(C)]
pub struct ClassDesc {
pub name: FfiStr,
pub methods: *const MethodDesc,
pub methods_len: usize,
pub drop: Option<extern "C" fn(opaque_ptr: *mut c_void)>,
pub traverse: Option<
extern "C" fn(opaque_ptr: *mut c_void, visit: PluginVisitFn, visit_ctx: *mut c_void) -> i32,
>,
}
#[repr(C)]
pub struct ModuleDesc {
pub abi_version: u32,
pub functions: *const FunctionDesc,
pub functions_len: usize,
pub classes: *const ClassDesc,
pub classes_len: usize,
pub values: *const ValueDesc,
pub values_len: usize,
}
unsafe impl Sync for ModuleDesc {}
#[repr(C)]
pub struct HostApi {
pub abi_version: u32,
pub ctx: *mut c_void,
pub value_kind: extern "C" fn(ctx: *mut c_void, value: GenericValue) -> u32,
pub bool_get: extern "C" fn(ctx: *mut c_void, value: GenericValue, out: *mut bool) -> bool,
pub int_get: extern "C" fn(ctx: *mut c_void, value: GenericValue, out: *mut i64) -> bool,
pub float_get: extern "C" fn(ctx: *mut c_void, value: GenericValue, out: *mut f64) -> bool,
pub string_get: extern "C" fn(ctx: *mut c_void, value: GenericValue, out: *mut FfiStr) -> bool,
pub list_len: extern "C" fn(ctx: *mut c_void, value: GenericValue, out: *mut usize) -> bool,
pub list_get: extern "C" fn(ctx: *mut c_void, value: GenericValue, index: usize) -> FfiReturn,
pub tuple_len: extern "C" fn(ctx: *mut c_void, value: GenericValue, out: *mut usize) -> bool,
pub tuple_get: extern "C" fn(ctx: *mut c_void, value: GenericValue, index: usize) -> FfiReturn,
pub dict_len: extern "C" fn(ctx: *mut c_void, value: GenericValue, out: *mut usize) -> bool,
pub set_len: extern "C" fn(ctx: *mut c_void, value: GenericValue, out: *mut usize) -> bool,
pub builtin_get: extern "C" fn(ctx: *mut c_void, name: FfiStr) -> FfiReturn,
pub is_instance:
extern "C" fn(ctx: *mut c_void, value: GenericValue, of_class: GenericValue) -> FfiReturn,
pub class_of: extern "C" fn(ctx: *mut c_void, value: GenericValue) -> FfiReturn,
pub attr_get:
extern "C" fn(ctx: *mut c_void, receiver: GenericValue, name: FfiStr) -> FfiReturn,
pub attr_set: extern "C" fn(
ctx: *mut c_void,
receiver: GenericValue,
name: FfiStr,
value: GenericValue,
) -> FfiReturn,
pub attr_has:
extern "C" fn(ctx: *mut c_void, receiver: GenericValue, name: FfiStr) -> FfiReturn,
pub nil_new: extern "C" fn(ctx: *mut c_void) -> GenericValue,
pub bool_new: extern "C" fn(ctx: *mut c_void, value: bool) -> GenericValue,
pub int_new: extern "C" fn(ctx: *mut c_void, value: i64) -> GenericValue,
pub float_new: extern "C" fn(ctx: *mut c_void, value: f64) -> GenericValue,
pub string_new: extern "C" fn(ctx: *mut c_void, value: FfiStr) -> FfiReturn,
pub list_new: extern "C" fn(ctx: *mut c_void) -> GenericValue,
pub list_push:
extern "C" fn(ctx: *mut c_void, list: GenericValue, item: GenericValue) -> FfiReturn,
pub list_set: extern "C" fn(
ctx: *mut c_void,
list: GenericValue,
index: usize,
value: GenericValue,
) -> FfiReturn,
pub exception_new:
extern "C" fn(ctx: *mut c_void, of_class: GenericValue, message: FfiStr) -> FfiReturn,
pub value_display: extern "C" fn(ctx: *mut c_void, value: GenericValue) -> GenericValue,
pub call_value: extern "C" fn(
ctx: *mut c_void,
callee: GenericValue,
args: *const GenericValue,
nargs: usize,
) -> FfiReturn,
pub invoke_method: extern "C" fn(
ctx: *mut c_void,
receiver: GenericValue,
name: FfiStr,
args: *const GenericValue,
nargs: usize,
) -> FfiReturn,
pub value_str: extern "C" fn(ctx: *mut c_void, value: GenericValue) -> FfiReturn,
pub dict_get:
extern "C" fn(ctx: *mut c_void, dict: GenericValue, key: GenericValue) -> FfiReturn,
pub dict_set: extern "C" fn(
ctx: *mut c_void,
dict: GenericValue,
key: GenericValue,
value: GenericValue,
) -> FfiReturn,
pub dict_contains:
extern "C" fn(ctx: *mut c_void, dict: GenericValue, key: GenericValue) -> FfiReturn,
pub set_add:
extern "C" fn(ctx: *mut c_void, set: GenericValue, item: GenericValue) -> FfiReturn,
pub set_contains:
extern "C" fn(ctx: *mut c_void, set: GenericValue, item: GenericValue) -> FfiReturn,
pub value_truthy: extern "C" fn(ctx: *mut c_void, value: GenericValue) -> FfiReturn,
pub value_equals:
extern "C" fn(ctx: *mut c_void, a: GenericValue, b: GenericValue) -> FfiReturn,
pub value_hash: extern "C" fn(ctx: *mut c_void, value: GenericValue) -> FfiReturn,
pub root: extern "C" fn(ctx: *mut c_void, value: GenericValue),
pub unroot: extern "C" fn(ctx: *mut c_void, n: usize),
pub instance_set_opaque:
extern "C" fn(ctx: *mut c_void, receiver: GenericValue, ptr: *mut c_void) -> FfiReturn,
pub instance_get_opaque: extern "C" fn(ctx: *mut c_void, receiver: GenericValue) -> *mut c_void,
}