{% 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 %}
})
}