#![allow(unsafe_code)]
use crate::panic_guard::FfiBoundary;
use crate::runtime::EngineContext;
use crate::sys;
fn report_u32(out: *mut u32, value: Option<u32>) -> bool {
match value {
Some(v) => {
if !out.is_null() {
unsafe { *out = v };
}
true
}
None => false,
}
}
#[doc(hidden)]
#[unsafe(no_mangle)]
pub unsafe extern "C" fn rust__handler__max_supported_record_length(
ctx: *mut EngineContext,
out: *mut u32,
) -> bool {
FfiBoundary::run_default(false, || {
report_u32(
out,
unsafe { &mut *ctx }
.engine_mut()
.max_supported_record_length(),
)
})
}
#[doc(hidden)]
#[unsafe(no_mangle)]
pub unsafe extern "C" fn rust__handler__max_supported_keys(
ctx: *mut EngineContext,
out: *mut u32,
) -> bool {
FfiBoundary::run_default(false, || {
report_u32(out, unsafe { &mut *ctx }.engine_mut().max_supported_keys())
})
}
#[doc(hidden)]
#[unsafe(no_mangle)]
pub unsafe extern "C" fn rust__handler__max_supported_key_parts(
ctx: *mut EngineContext,
out: *mut u32,
) -> bool {
FfiBoundary::run_default(false, || {
report_u32(
out,
unsafe { &mut *ctx }.engine_mut().max_supported_key_parts(),
)
})
}
#[doc(hidden)]
#[unsafe(no_mangle)]
pub unsafe extern "C" fn rust__handler__max_supported_key_length(
ctx: *mut EngineContext,
out: *mut u32,
) -> bool {
FfiBoundary::run_default(false, || {
report_u32(
out,
unsafe { &mut *ctx }.engine_mut().max_supported_key_length(),
)
})
}
#[doc(hidden)]
#[unsafe(no_mangle)]
pub unsafe extern "C" fn rust__handler__max_supported_key_part_length(
ctx: *mut EngineContext,
create_info: *const sys::HA_CREATE_INFO,
out: *mut u32,
) -> bool {
FfiBoundary::run_default(false, || {
let engine = unsafe { &mut *ctx }.engine_mut();
let create_info = unsafe { create_info.as_ref() };
report_u32(out, engine.max_supported_key_part_length(create_info))
})
}
#[doc(hidden)]
#[unsafe(no_mangle)]
pub unsafe extern "C" fn rust__handler__min_record_length(
ctx: *mut EngineContext,
options: u32,
out: *mut u32,
) -> bool {
FfiBoundary::run_default(false, || {
report_u32(
out,
unsafe { &mut *ctx }.engine_mut().min_record_length(options),
)
})
}
#[doc(hidden)]
#[unsafe(no_mangle)]
pub unsafe extern "C" fn rust__handler__extra_rec_buf_length(
ctx: *mut EngineContext,
out: *mut u32,
) -> bool {
FfiBoundary::run_default(false, || {
report_u32(
out,
unsafe { &mut *ctx }.engine_mut().extra_rec_buf_length(),
)
})
}
#[doc(hidden)]
#[unsafe(no_mangle)]
pub unsafe extern "C" fn rust__handler__memory_buffer_size(
ctx: *mut EngineContext,
out: *mut i64,
) -> bool {
FfiBoundary::run_default(false, || {
match unsafe { &mut *ctx }.engine_mut().memory_buffer_size() {
Some(v) => {
if !out.is_null() {
unsafe { *out = v };
}
true
}
None => false,
}
})
}
#[cfg(test)]
mod tests {
use super::report_u32;
#[test]
fn report_u32_writes_value_and_signals_handled() {
let mut out: u32 = 0;
assert!(report_u32(&raw mut out, Some(42)));
assert_eq!(out, 42);
}
#[test]
fn report_u32_none_leaves_buffer_untouched_and_signals_unhandled() {
let mut out: u32 = 7;
assert!(!report_u32(&raw mut out, None));
assert_eq!(out, 7);
}
#[test]
fn report_u32_tolerates_null_out_pointer() {
assert!(report_u32(core::ptr::null_mut(), Some(99)));
}
}