alef 0.79.1

Opinionated polyglot binding generator for Rust libraries
Documentation
use crate::core::ir::{FieldDef, TypeRef};
use heck::{ToPascalCase, ToSnakeCase};

pub(super) fn emit_optional_kwarg_helper(
    out: &mut String,
    type_name: &str,
    type_snake: &str,
    field: &FieldDef,
    parameter_name: &str,
) -> String {
    let helper_name = format!("_optional_{}_{}", type_snake, field.name.to_snake_case());
    let kwargs_name = format!("_{}{}Kwargs", type_name, field.name.to_pascal_case());
    let value_type = optional_kwarg_python_type(&field.ty);
    out.push_str(&crate::backends::pyo3::template_env::render(
        "converters/optional_kwarg_helper.jinja",
        minijinja::context! {
            helper_name => &helper_name,
            kwargs_name => &kwargs_name,
            parameter_name => parameter_name,
            value_type => &value_type,
        },
    ));
    out.push_str("\n\n");
    helper_name
}

fn optional_kwarg_python_type(ty: &TypeRef) -> String {
    match ty {
        TypeRef::Named(name) => format!("_rust.{name}"),
        TypeRef::Vec(inner) => format!("list[{}]", optional_kwarg_python_type(inner)),
        TypeRef::Map(key, value) => format!(
            "dict[{}, {}]",
            optional_kwarg_python_type(key),
            optional_kwarg_python_type(value)
        ),
        TypeRef::Optional(inner) => optional_kwarg_python_type(inner),
        other => crate::backends::pyo3::type_map::python_type(other),
    }
}