Skip to main content

alef_codegen/conversions/
enums.rs

1use alef_core::ir::EnumDef;
2
3use super::ConversionConfig;
4use super::helpers::{binding_to_core_match_arm_ext_cfg, core_enum_path_remapped, core_to_binding_match_arm_ext_cfg};
5
6/// Generate `impl From<BindingEnum> for core::Enum` (binding -> core).
7pub fn gen_enum_from_binding_to_core(enum_def: &EnumDef, core_import: &str) -> String {
8    gen_enum_from_binding_to_core_cfg(enum_def, core_import, &ConversionConfig::default())
9}
10
11/// Generate `impl From<BindingEnum> for core::Enum` with backend-specific config.
12pub fn gen_enum_from_binding_to_core_cfg(enum_def: &EnumDef, core_import: &str, config: &ConversionConfig) -> String {
13    let core_path = core_enum_path_remapped(enum_def, core_import, config.source_crate_remaps);
14    let binding_name = format!("{}{}", config.type_name_prefix, enum_def.name);
15
16    // Pre-compute all arms for the template
17    let arms: Vec<String> = enum_def
18        .variants
19        .iter()
20        .map(|variant| {
21            binding_to_core_match_arm_ext_cfg(
22                &binding_name,
23                &variant.name,
24                &variant.fields,
25                config.binding_enums_have_data,
26                config,
27                enum_def.serde_untagged && config.binding_tuple_form_for_untagged_variants,
28            )
29        })
30        .collect();
31
32    crate::template_env::render(
33        "conversions/enum_from_binding_to_core",
34        minijinja::context! {
35            binding_name => binding_name,
36            core_path => core_path,
37            arms => arms,
38        },
39    )
40}
41
42/// Generate `impl From<core::Enum> for BindingEnum` (core -> binding).
43pub fn gen_enum_from_core_to_binding(enum_def: &EnumDef, core_import: &str) -> String {
44    gen_enum_from_core_to_binding_cfg(enum_def, core_import, &ConversionConfig::default())
45}
46
47/// Generate `impl From<core::Enum> for BindingEnum` with backend-specific config.
48pub fn gen_enum_from_core_to_binding_cfg(enum_def: &EnumDef, core_import: &str, config: &ConversionConfig) -> String {
49    let core_path = core_enum_path_remapped(enum_def, core_import, config.source_crate_remaps);
50    let binding_name = format!("{}{}", config.type_name_prefix, enum_def.name);
51
52    // Pre-compute all arms for the template
53    let arms: Vec<String> = enum_def
54        .variants
55        .iter()
56        .map(|variant| {
57            core_to_binding_match_arm_ext_cfg(
58                &core_path,
59                &variant.name,
60                &variant.fields,
61                config.binding_enums_have_data,
62                config,
63                enum_def.serde_untagged && config.binding_tuple_form_for_untagged_variants,
64            )
65        })
66        .collect();
67
68    crate::template_env::render(
69        "conversions/enum_from_core_to_binding",
70        minijinja::context! {
71            binding_name => binding_name,
72            core_path => core_path,
73            arms => arms,
74        },
75    )
76}