alef_codegen/conversions/
enums.rs1use alef_core::ir::EnumDef;
2use std::fmt::Write;
3
4use super::ConversionConfig;
5use super::helpers::{binding_to_core_match_arm_ext_cfg, core_enum_path_remapped, core_to_binding_match_arm_ext_cfg};
6
7pub 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
12pub fn gen_enum_from_binding_to_core_cfg(enum_def: &EnumDef, core_import: &str, config: &ConversionConfig) -> String {
14 let core_path = core_enum_path_remapped(enum_def, core_import, config.source_crate_remaps);
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_cfg(
22 &binding_name,
23 &variant.name,
24 &variant.fields,
25 config.binding_enums_have_data,
26 config,
27 );
28 writeln!(out, " {arm}").ok();
29 }
30 writeln!(out, " }}").ok();
31 writeln!(out, " }}").ok();
32 write!(out, "}}").ok();
33 out
34}
35
36pub fn gen_enum_from_core_to_binding(enum_def: &EnumDef, core_import: &str) -> String {
38 gen_enum_from_core_to_binding_cfg(enum_def, core_import, &ConversionConfig::default())
39}
40
41pub fn gen_enum_from_core_to_binding_cfg(enum_def: &EnumDef, core_import: &str, config: &ConversionConfig) -> String {
43 let core_path = core_enum_path_remapped(enum_def, core_import, config.source_crate_remaps);
44 let binding_name = format!("{}{}", config.type_name_prefix, enum_def.name);
45 let mut out = String::with_capacity(256);
46 writeln!(out, "impl From<{core_path}> for {binding_name} {{").ok();
47 writeln!(out, " fn from(val: {core_path}) -> Self {{").ok();
48 writeln!(out, " match val {{").ok();
49 for variant in &enum_def.variants {
50 let arm = core_to_binding_match_arm_ext_cfg(
51 &core_path,
52 &variant.name,
53 &variant.fields,
54 config.binding_enums_have_data,
55 config,
56 );
57 writeln!(out, " {arm}").ok();
58 }
59 writeln!(out, " }}").ok();
60 writeln!(out, " }}").ok();
61 write!(out, "}}").ok();
62 out
63}