use sdk_raw::test_support::utl_vector;
use sdk_raw::tf2::script_binding::SF_MEMBER_FUNC;
use std::cell::Cell;
use std::ffi::CStr;
use std::mem::zeroed;
use std::ptr::null_mut;
pub const SCRIPT_DESCRIPTION_SLOT: usize =
sdk_raw::vtable_slot!(sys::CBaseEntity__bindgen_vtable, CBaseEntity_GetScriptDesc);
thread_local! {
static DESCRIPTION: Cell<*mut sys::ScriptClassDesc_t> = const { Cell::new(null_mut()) };
}
pub fn class_description(
name: &'static CStr,
bindings: &mut [sys::ScriptFunctionBinding_t],
base: *mut sys::ScriptClassDesc_t,
) -> sys::ScriptClassDesc_t {
let mut description: sys::ScriptClassDesc_t = unsafe { zeroed() };
description.m_pszClassname = name.as_ptr();
description.m_pBaseDesc = base;
if !bindings.is_empty() {
description.m_FunctionBindings = utl_vector(bindings);
}
description
}
pub fn member_binding(
name: &'static CStr,
returns: sys::ScriptDataType_t,
parameters: &mut [sys::ScriptDataType_t],
adapter: sys::ScriptBindingFunc_t,
) -> sys::ScriptFunctionBinding_t {
let mut binding: sys::ScriptFunctionBinding_t = unsafe { zeroed() };
binding.m_desc.m_pszScriptName = name.as_ptr();
binding.m_desc.m_ReturnType = returns;
binding.m_flags = SF_MEMBER_FUNC;
binding.m_pfnBinding = adapter;
if !parameters.is_empty() {
binding.m_desc.m_Parameters = utl_vector(parameters);
}
binding
}
pub unsafe extern "C" fn script_description(
_: *mut sys::CBaseEntity,
) -> *mut sys::ScriptClassDesc_t {
DESCRIPTION.get()
}
pub fn set_script_description(description: *mut sys::ScriptClassDesc_t) {
DESCRIPTION.set(description);
}