use super::{TransformOptions, advanced::convert_callback};
#[allow(clippy::cast_possible_wrap)]
pub fn ffi_map_advanced(
str: &str,
options: TransformOptions,
mut transform: Option<&mut dyn FnMut(char) -> char>,
) -> Result<mbox::MArray<u8>, crate::Error> {
let raw_options = unsafe { options.to_ffi() };
let mut dest_buffer: *mut u8 = std::ptr::null_mut();
let (callback, callback_data) = unsafe { convert_callback(&mut transform) };
let res_code = unsafe {
utf8proc_sys::utf8proc_map_custom(
str.as_ptr(),
str.len() as isize,
&raw mut dest_buffer,
raw_options,
callback,
callback_data,
)
};
if res_code < 0 {
Err(crate::Error::from_code(res_code))
} else {
assert!(!dest_buffer.is_null());
let len = res_code.cast_unsigned();
let res = unsafe { mbox::MArray::from_raw(dest_buffer.cast()) };
assert_eq!(res.len(), len);
Ok(res)
}
}