Skip to main content

rh_codegen/generators/file_generator/
enum_files.rs

1use 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}