alef 0.115.6

Opinionated polyglot binding generator for Rust libraries
Documentation
use crate::e2e::field_access::{FieldResolver, WireAccessStep};

pub(super) fn accessor(result: &str, field: &str, resolver: &FieldResolver) -> Option<String> {
    let (prefix, owner, variant, suffix) = resolver.ir_tagged_union_split(resolver.resolve(field))?;
    let definition = resolver.enum_definition(&owner)?;
    if !definition.serde_untagged
        || !definition
            .variants
            .iter()
            .any(|item| item.name == variant && item.is_tuple)
        || !resolver.union_variant_payload_is_collection(&owner, &variant)
    {
        return None;
    }
    let steps = resolver.enum_payload_wire_steps(&owner, &variant, &suffix)?;
    let steps = steps
        .into_iter()
        .map(|step| match step {
            WireAccessStep::Index(index) => crate::alef_context! { kind => "index", index => index },
            WireAccessStep::Field(key) => {
                crate::alef_context! { kind => "field", key => crate::e2e::escape::escape_zig(&key) }
            }
        })
        .collect::<Vec<_>>();
    let expression =
        super::json_access::json_path_expr_with(result, "", &prefix, super::json_access::Unwrap::Panic, resolver);
    Some(
        crate::e2e::template_env::render(
            "zig/enum_collection_accessor.jinja",
            crate::alef_context! {
                expression => expression, steps => steps,
            },
        )
        .trim_end()
        .to_string(),
    )
}

#[cfg(test)]
#[path = "enum_collection/tests.rs"]
mod tests;