alef 0.64.0

Opinionated polyglot binding generator for Rust libraries
Documentation
{% if source_cfg -%}
#[cfg({{ source_cfg }})]
{% endif -%}
/// Get the `{{ field_name }}` field from a `{{ type_name }}`.
{% for ownership_line in ownership_lines -%}
/// {{ ownership_line }}
{% endfor -%}
/// # Safety
/// Pointer must be a valid handle returned by this library.
#[unsafe(no_mangle)]
pub unsafe extern "C" fn {{ prefix }}_{{ type_snake }}_{{ field_name }}({% if needs_len_out %}handle: AlefHandle, out_len: *mut usize{% else %}handle: AlefHandle{% endif %}) -> {{ ret_type }} {
    catch_ffi_panic({{ null_return_value }}, || {
    if handle == 0 {
        return {{ null_return_value }};
    }
    let result = with_handle::<{% if serialized_handle %}SerializedHandle<{{ qualified }}>{% else %}{{ qualified }}{% endif %}, _>(handle, |{% if serialized_handle %}snapshot{% else %}obj{% endif %}| {
{% if serialized_handle %}
        serde_json::from_str::<{{ qualified }}>(&snapshot.json).map(|obj| {
{{ body }}
        })
{% else %}
{{ body }}
{% endif %}
    });
{% if serialized_handle %}
    match result {
        Ok(Ok(value)) => value,
        Ok(Err(error)) => { set_last_error(2, &error.to_string()); {{ null_return_value }} }
        Err(error) => { set_handle_error(&error); {{ null_return_value }} }
    }
{% else %}
    match result {
        Ok(value) => value,
        Err(error) => { set_handle_error(&error); {{ null_return_value }} }
    }
{% endif %}
    })
}