alef 0.114.2

Opinionated polyglot binding generator for Rust libraries
Documentation
use crate::core::ir::{EnumDef, TypeDef, TypeRef};
use crate::e2e::field_access::SwiftFirstClassMap;
use std::collections::HashSet;

pub(super) fn normalized_fields(types: &[TypeDef]) -> Vec<TypeDef> {
    types
        .iter()
        .cloned()
        .map(|mut definition| {
            for field in &mut definition.fields {
                field.optional |= matches!(field.ty, TypeRef::Optional(_));
            }
            definition
        })
        .collect()
}

pub(super) fn apply(mut map: SwiftFirstClassMap, types: &[TypeDef], configured: &[String]) -> SwiftFirstClassMap {
    let text_types: HashSet<&str> = configured.iter().map(String::as_str).collect();
    for definition in types {
        for field in &definition.fields {
            let Some(return_type) =
                crate::backends::swift::gen_rust_crate::type_bridge::text_projected_getter_type(field, &text_types)
            else {
                continue;
            };
            map.getter_optionality
                .entry(definition.name.clone())
                .or_default()
                .insert(field.name.clone(), return_type == "Option<String>");
            map.json_bridged_by_type
                .entry(definition.name.clone())
                .or_default()
                .insert(field.name.clone(), false);
        }
    }
    map.json_bridged_field_names = map
        .json_bridged_by_type
        .values()
        .flat_map(|fields| {
            fields
                .iter()
                .filter_map(|(name, bridged)| bridged.then_some(name.clone()))
        })
        .collect();
    map
}

pub(super) fn lossless_fields(
    types: &[TypeDef],
    enums: &[EnumDef],
    configured: &[String],
) -> std::collections::HashMap<String, HashSet<String>> {
    let serde_text_types = enums
        .iter()
        .filter(|definition| definition.has_serde && configured.contains(&definition.name))
        .map(|definition| definition.name.as_str())
        .collect();
    let mut fields = std::collections::HashMap::<String, HashSet<String>>::new();
    for definition in types {
        for field in &definition.fields {
            if definition.has_serde
                && !field.serde_skip
                && crate::backends::swift::gen_rust_crate::type_bridge::text_projected_getter_type(
                    field,
                    &serde_text_types,
                )
                .is_some()
            {
                fields
                    .entry(definition.name.clone())
                    .or_default()
                    .insert(field.name.clone());
            }
        }
    }
    fields
}

pub(super) fn resolver(
    resolver: crate::e2e::field_access::FieldResolver,
    types: &[TypeDef],
    enums: &[EnumDef],
    config: &crate::core::config::ResolvedCrateConfig,
) -> crate::e2e::field_access::FieldResolver {
    resolver.with_swift_lossless_text_fields(lossless_fields(types, enums, &config.untagged_union_text_types))
}