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            )
28        })
29        .collect();
30
31    crate::template_env::render(
32        "conversions/enum_from_binding_to_core",
33        minijinja::context! {
34            binding_name => binding_name,
35            core_path => core_path,
36            arms => arms,
37        },
38    )
39}
40
41/// Generate `impl From<core::Enum> for BindingEnum` (core -> binding).
42pub fn gen_enum_from_core_to_binding(enum_def: &EnumDef, core_import: &str) -> String {
43    gen_enum_from_core_to_binding_cfg(enum_def, core_import, &ConversionConfig::default())
44}
45
46/// Generate `impl From<core::Enum> for BindingEnum` with backend-specific config.
47pub fn gen_enum_from_core_to_binding_cfg(enum_def: &EnumDef, core_import: &str, config: &ConversionConfig) -> String {
48    let core_path = core_enum_path_remapped(enum_def, core_import, config.source_crate_remaps);
49    let binding_name = format!("{}{}", config.type_name_prefix, enum_def.name);
50
51    // Pre-compute all arms for the template
52    let arms: Vec<String> = enum_def
53        .variants
54        .iter()
55        .map(|variant| {
56            core_to_binding_match_arm_ext_cfg(
57                &core_path,
58                &variant.name,
59                &variant.fields,
60                config.binding_enums_have_data,
61                config,
62            )
63        })
64        .collect();
65
66    crate::template_env::render(
67        "conversions/enum_from_core_to_binding",
68        minijinja::context! {
69            binding_name => binding_name,
70            core_path => core_path,
71            arms => arms,
72        },
73    )
74}