#[extendr]
pub fn new_{{ type_name_lower }}(
{% for field in params -%}
{{ field.name }}: {{ field.type }}{{ "," if not loop.last else "" }}
{% endfor -%}
) -> {% if has_named_enum %}extendr_api::Result<{{ type_name }}>{% else %}{{ type_name }}{% endif %} {
let mut __out = <{{ type_name }}>::default();
{% for field in body_assignments -%}
{% if field.is_named_enum %}
if let Some(v) = {{ field.name }} {
let parsed = serde_json::from_value(serde_json::Value::String(v))
.map_err(|e| extendr_api::Error::Other(format!("invalid value for `{{ field.name }}`: {e}")))?;
{% if field.optional_enum %} __out.{{ field.name }} = Some(parsed);
{% else %} __out.{{ field.name }} = parsed;
{% endif %} }
{% elif field.optional_value %}
if let Some(v) = {{ field.name }} { __out.{{ field.name }} = Some(v); }
{% else %}
if let Some(v) = {{ field.name }} { __out.{{ field.name }} = v; }
{% endif %}
{% endfor -%}
{% if has_named_enum %}Ok(__out){% else %}__out{% endif %}
}