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, core_enum_path, core_to_binding_match_arm};
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(&binding_name, &variant.name, &variant.fields);
22        writeln!(out, "            {arm}").ok();
23    }
24    writeln!(out, "        }}").ok();
25    writeln!(out, "    }}").ok();
26    write!(out, "}}").ok();
27    out
28}
29
30/// Generate `impl From<core::Enum> for BindingEnum` (core -> binding).
31pub fn gen_enum_from_core_to_binding(enum_def: &EnumDef, core_import: &str) -> String {
32    gen_enum_from_core_to_binding_cfg(enum_def, core_import, &ConversionConfig::default())
33}
34
35/// Generate `impl From<core::Enum> for BindingEnum` with backend-specific config.
36pub fn gen_enum_from_core_to_binding_cfg(enum_def: &EnumDef, core_import: &str, config: &ConversionConfig) -> String {
37    let core_path = core_enum_path(enum_def, core_import);
38    let binding_name = format!("{}{}", config.type_name_prefix, enum_def.name);
39    let mut out = String::with_capacity(256);
40    writeln!(out, "impl From<{core_path}> for {binding_name} {{").ok();
41    writeln!(out, "    fn from(val: {core_path}) -> Self {{").ok();
42    writeln!(out, "        match val {{").ok();
43    for variant in &enum_def.variants {
44        let arm = core_to_binding_match_arm(&core_path, &variant.name, &variant.fields);
45        writeln!(out, "            {arm}").ok();
46    }
47    writeln!(out, "        }}").ok();
48    writeln!(out, "    }}").ok();
49    write!(out, "}}").ok();
50    out
51}