alef 0.82.1

Opinionated polyglot binding generator for Rust libraries
Documentation
/// Opaque handle to a {{ service_name }} service instance.
/// Allocated by {{ new_fn_name }}(), freed by {{ free_fn_name }}().
///
/// `inner` is `Option<Box<…>>` so a `Finalize` entrypoint can `.take()` the
/// owner out without invalidating the C pointer. Consumers must still call
/// `{{ free_fn_name }}()` after a `Finalize` returns to release the opaque
/// shell; the shell drops trivially when `inner` is `None`.
#[repr(C)]
pub struct {{ opaque_name }} {
    inner: Option<Box<{{ owner_path }}>>,
}

/// Allocate a new {{ service_name }} instance.
///
/// # Safety
/// The returned pointer must be freed via {{ free_fn_name }}().
/// Never access the pointer after freeing it.
#[unsafe(no_mangle)]
pub extern "C" fn {{ new_fn_name }}() -> AlefHandle {
    catch_ffi_panic(0, || {
        let owner = {{ owner_path }}::{{ constructor_name }}();
        match insert_handle({{ opaque_name }} {
            inner: Some(Box::new(owner)),
        }) {
            Ok(handle) => handle,
            Err(error) => { set_handle_error(&error); 0 }
        }
    })
}

/// Free a {{ service_name }} instance allocated by {{ new_fn_name }}().
///
/// # Safety
/// - `ptr` must have been allocated by {{ new_fn_name }}().
/// - After this call, `ptr` is invalid and must not be dereferenced.
/// - Calling this twice on the same pointer causes undefined behavior.
/// - Safe to call even after a `Finalize` entrypoint has emptied `inner`.
#[unsafe(no_mangle)]
pub extern "C" fn {{ free_fn_name }}(handle: AlefHandle) {
    catch_ffi_panic((), || {
    if handle != 0
        && let Err(error) = remove_handle::<{{ opaque_name }}>(handle)
    {
        set_handle_error(&error);
    }
    })
}