Skip to main content

alef_codegen/conversions/
enums.rs

1use alef_core::ir::EnumDef;
2use std::fmt::Write;
3
4use super::ConversionConfig;
5use super::helpers::{binding_to_core_match_arm_ext, core_enum_path, core_to_binding_match_arm_ext};
6
7/// Generate `impl From<BindingEnum> for core::Enum` (binding -> core).
8pub fn gen_enum_from_binding_to_core(enum_def: &EnumDef, core_import: &str) -> String {
9    gen_enum_from_binding_to_core_cfg(enum_def, core_import, &ConversionConfig::default())
10}
11
12/// Generate `impl From<BindingEnum> for core::Enum` with backend-specific config.
13pub fn gen_enum_from_binding_to_core_cfg(enum_def: &EnumDef, core_import: &str, config: &ConversionConfig) -> String {
14    let core_path = core_enum_path(enum_def, core_import);
15    let binding_name = format!("{}{}", config.type_name_prefix, enum_def.name);
16    let mut out = String::with_capacity(256);
17    writeln!(out, "impl From<{binding_name}> for {core_path} {{").ok();
18    writeln!(out, "    fn from(val: {binding_name}) -> Self {{").ok();
19    writeln!(out, "        match val {{").ok();
20    for variant in &enum_def.variants {
21        let arm = binding_to_core_match_arm_ext(
22            &binding_name,
23            &variant.name,
24            &variant.fields,
25            config.binding_enums_have_data,
26        );
27        writeln!(out, "            {arm}").ok();
28    }
29    writeln!(out, "        }}").ok();
30    writeln!(out, "    }}").ok();
31    write!(out, "}}").ok();
32    out
33}
34
35/// Generate `impl From<core::Enum> for BindingEnum` (core -> binding).
36pub fn gen_enum_from_core_to_binding(enum_def: &EnumDef, core_import: &str) -> String {
37    gen_enum_from_core_to_binding_cfg(enum_def, core_import, &ConversionConfig::default())
38}
39
40/// Generate `impl From<core::Enum> for BindingEnum` with backend-specific config.
41pub fn gen_enum_from_core_to_binding_cfg(enum_def: &EnumDef, core_import: &str, config: &ConversionConfig) -> String {
42    let core_path = core_enum_path(enum_def, core_import);
43    let binding_name = format!("{}{}", config.type_name_prefix, enum_def.name);
44    let mut out = String::with_capacity(256);
45    writeln!(out, "impl From<{core_path}> for {binding_name} {{").ok();
46    writeln!(out, "    fn from(val: {core_path}) -> Self {{").ok();
47    writeln!(out, "        match val {{").ok();
48    for variant in &enum_def.variants {
49        let arm = core_to_binding_match_arm_ext(
50            &core_path,
51            &variant.name,
52            &variant.fields,
53            config.binding_enums_have_data,
54        );
55        writeln!(out, "            {arm}").ok();
56    }
57    writeln!(out, "        }}").ok();
58    writeln!(out, "    }}").ok();
59    write!(out, "}}").ok();
60    out
61}