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, core_enum_path, core_to_binding_match_arm};
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(&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
30pub 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
35pub 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}