rh_codegen/generators/file_generator/
enum_files.rs1use std::fs;
2use std::path::Path;
3
4use quote::quote;
5
6use crate::generators::enum_generator::EnumGenerator;
7use crate::{CodegenError, CodegenResult};
8
9use super::FileGenerator;
10
11impl<'a> FileGenerator<'a> {
12 pub fn generate_enum_files<P: AsRef<Path>>(
13 &self,
14 enums_dir: P,
15 enum_generator: &EnumGenerator,
16 ) -> CodegenResult<()> {
17 let enums_dir = enums_dir.as_ref();
18
19 if !enums_dir.exists() {
20 fs::create_dir_all(enums_dir)?;
21 }
22
23 for (enum_name, rust_enum) in enum_generator.get_cached_enums() {
24 let enum_filename = EnumGenerator::enum_name_to_filename(enum_name);
25 let enum_file_path = enums_dir.join(enum_filename);
26
27 let import_tokens = quote! {
28 use serde::{Deserialize, Serialize};
29 };
30 let enum_tokens = self.token_generator.generate_enum(rust_enum);
31 let combined_tokens = quote! {
32 #import_tokens
33
34 #enum_tokens
35 };
36
37 let syntax_tree =
38 syn::parse2(combined_tokens).map_err(|e| CodegenError::Generation {
39 message: format!("Failed to parse generated enum tokens for {enum_name}: {e}"),
40 })?;
41
42 let formatted_code = prettyplease::unparse(&syntax_tree);
43
44 if enum_file_path.exists() {
45 eprintln!(
46 "Warning: Enum file '{}' already exists and will be overwritten.",
47 enum_file_path.display()
48 );
49 }
50
51 fs::write(&enum_file_path, formatted_code)?;
52 }
53
54 Ok(())
55 }
56
57 pub fn generate_enums_mod_file<P: AsRef<Path>>(
58 &self,
59 enums_dir: P,
60 enum_generator: &EnumGenerator,
61 ) -> CodegenResult<()> {
62 let enums_dir = enums_dir.as_ref();
63 let mod_file_path = enums_dir.join("mod.rs");
64
65 let mut mod_content = vec![
66 "//! FHIR ValueSet enums".to_string(),
67 "//!".to_string(),
68 "//! This module contains all the generated enums from FHIR ValueSets.".to_string(),
69 "//! Each enum represents a specific ValueSet and its allowed codes.".to_string(),
70 "".to_string(),
71 ];
72
73 let mut enum_names: Vec<_> = enum_generator.get_cached_enums().keys().collect();
74 enum_names.sort();
75
76 for enum_name in enum_names {
77 let module_name = EnumGenerator::enum_name_to_module_name(enum_name);
78 mod_content.push(format!("pub mod {module_name};"));
79 }
80
81 let final_content = mod_content.join("\n") + "\n";
82
83 if mod_file_path.exists() {
84 eprintln!(
85 "Warning: Enum mod file '{}' already exists and will be overwritten.",
86 mod_file_path.display()
87 );
88 }
89
90 fs::write(&mod_file_path, final_content)?;
91
92 Ok(())
93 }
94}