use std::ffi::{c_char, c_int};
use std::ffi::{c_double, c_float, c_void};
use std::ptr::{self, null};
#[allow(non_camel_case_types)]
#[repr(C)]
#[derive(Debug, Clone, Copy)]
pub enum LuauBytecodeType {
LBC_TYPE_NIL = 0,
LBC_TYPE_BOOLEAN,
LBC_TYPE_NUMBER,
LBC_TYPE_STRING,
LBC_TYPE_TABLE,
LBC_TYPE_FUNCTION,
LBC_TYPE_THREAD,
LBC_TYPE_USERDATA,
LBC_TYPE_VECTOR,
LBC_TYPE_BUFFER,
LBC_TYPE_ANY = 15,
LBC_TYPE_TAGGED_USERDATA_BASE = 64,
LBC_TYPE_TAGGED_USERDATA_END = 64 + 32,
LBC_TYPE_OPTIONAL_BIT = 1 << 7,
LBC_TYPE_INVALID = 256,
}
pub type LuauCompilerConstant = *mut c_void;
pub type LuauLibraryMemberTypeCallback =
unsafe extern "C-unwind" fn(library: *const c_char, member: *const c_char) -> LuauBytecodeType;
pub type LuauLibraryMemberConstantCallback = unsafe extern "C-unwind" fn(
library: *const c_char,
member: *const c_char,
constant: LuauCompilerConstant,
);
#[repr(C)]
#[allow(non_snake_case)]
pub struct LuauCompileOptions {
pub optimizationLevel: c_int,
pub debugLevel: c_int,
pub typeInfoLevel: c_int,
pub coverageLevel: c_int,
pub vectorLib: *const c_char,
pub vectorCtor: *const c_char,
pub vectorType: *const c_char,
pub mutableGlobals: *const *const c_char,
pub userdataTypes: *const *const c_char,
pub librariesWithKnownMembers: *const *const c_char,
pub libraryMemberTypeCallback: Option<LuauLibraryMemberTypeCallback>,
pub libraryMemberConstantCallback: Option<LuauLibraryMemberConstantCallback>,
pub disabledBuiltins: *const *const c_char,
}
impl Default for LuauCompileOptions {
fn default() -> Self {
Self {
optimizationLevel: 1,
debugLevel: 1,
typeInfoLevel: 0,
coverageLevel: 0,
vectorLib: ptr::null(),
vectorCtor: ptr::null(),
vectorType: ptr::null(),
mutableGlobals: ptr::null(),
userdataTypes: ptr::null(),
librariesWithKnownMembers: null(),
libraryMemberTypeCallback: None,
libraryMemberConstantCallback: None,
disabledBuiltins: null(),
}
}
}
extern "C-unwind" {
pub fn luau_compile(
source: *const c_char,
size: usize,
options: *mut LuauCompileOptions,
outsize: *mut usize,
) -> *mut c_char;
}
extern "C-unwind" {
pub fn luau_set_compile_constant_nil(constant: LuauCompilerConstant);
pub fn luau_set_compile_constant_boolean(constant: LuauCompilerConstant, b: c_int);
pub fn luau_set_compile_constant_number(constant: LuauCompilerConstant, n: c_double);
pub fn luau_set_compile_constant_vector(
constant: LuauCompilerConstant,
x: c_float,
y: c_float,
z: c_float,
w: c_float,
);
pub fn luau_set_compile_constant_string(
constant: LuauCompilerConstant,
s: *const c_char,
l: usize,
);
}
extern "C" {
#[link_name = "free"]
pub fn cstdlib_free(ptr: *mut c_void);
}