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, core_enum_path, core_to_binding_match_arm_ext};
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(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
35pub 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
40pub 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}