{%- if type_class == "primitive_bool" %}
{{ indent }}{{ expr }} as i32
{%- elif type_class == "primitive_other" %}
{{ indent }}{{ expr }}
{%- elif type_class == "string" %}
{{ indent }}match CString::new({{ expr }}.to_string()) {
{{ indent }} Ok(cs) => cs.into_raw(),
{{ indent }} Err(_) => {
{{ indent }} set_last_error(ALEF_FFI_CONVERSION_ERROR, "FFI field value contains an interior NUL byte");
{{ indent }} std::ptr::null_mut()
{{ indent }} },
{{ indent }}}
{%- elif type_class == "path" %}
{{ indent }}match CString::new({{ expr }}.to_string_lossy().to_string()) {
{{ indent }} Ok(cs) => cs.into_raw(),
{{ indent }} Err(_) => {
{{ indent }} set_last_error(ALEF_FFI_CONVERSION_ERROR, "FFI path value contains an interior NUL byte");
{{ indent }} std::ptr::null_mut()
{{ indent }} },
{{ indent }}}
{%- elif type_class == "json_or_vec_or_map" %}
{{ indent }}match serde_json::to_string(&{{ expr }}) {
{{ indent }} Ok(s) => match CString::new(s) {
{{ indent }} Ok(cs) => cs.into_raw(),
{{ indent }} Err(_) => {
{{ indent }} set_last_error(ALEF_FFI_CONVERSION_ERROR, "FFI JSON value contains an interior NUL byte");
{{ indent }} std::ptr::null_mut()
{{ indent }} },
{{ indent }} },
{{ indent }} Err(_) => {
{{ indent }} set_last_error(ALEF_FFI_CONVERSION_ERROR, "failed to serialize FFI field value");
{{ indent }} std::ptr::null_mut()
{{ indent }} },
{{ indent }}}
{%- elif type_class == "named_enum" %}
{{ indent }}match insert_handle({{ copy_expr }}) {
{{ indent }} Ok(handle) => handle,
{{ indent }} Err(error) => { set_handle_error(&error); 0 },
{{ indent }}}
{%- elif type_class == "named_clone" %}
{{ indent }}match insert_handle({{ expr }}.clone()) {
{{ indent }} Ok(handle) => handle,
{{ indent }} Err(error) => { set_handle_error(&error); 0 },
{{ indent }}}
{%- elif type_class == "named_owned" %}
{{ indent }}match insert_handle({{ expr }}) {
{{ indent }} Ok(handle) => handle,
{{ indent }} Err(error) => { set_handle_error(&error); 0 },
{{ indent }}}
{%- elif type_class == "named_non_clone" %}
{{ indent }}0
{%- elif type_class == "bytes" %}
{{ indent }}{{ expr }}.as_ptr() as *mut u8
{%- elif type_class == "duration" %}
{{ indent }}{{ expr }}.as_millis() as u64
{%- elif type_class == "optional" %}
{{ indent }}match &{{ expr }} {
{{ indent }} Some(val) => {
{{ inner_conversion }}
{{ indent }} }
{{ indent }} None => {{ null_value }},
{{ indent }}}
{%- elif type_class == "optional_owned" %}
{{ indent }}match {{ expr }} {
{{ indent }} Some(val) => {
{{ inner_conversion }}
{{ indent }} }
{{ indent }} None => {{ null_value }},
{{ indent }}}
{%- endif %}