Skip to main content

rh_codegen/generators/
enum_generator.rs

1//! Enum generation functionality
2//!
3//! This module handles the generation of Rust enums from FHIR ValueSets.
4
5use std::collections::HashMap;
6
7use crate::generators::type_registry::{TypeClassification, TypeRegistry};
8use crate::rust_types::RustEnum;
9use crate::value_sets::ValueSetManager;
10use crate::CodegenResult;
11
12/// Enum generator for FHIR ValueSets
13pub struct EnumGenerator<'a> {
14    value_set_manager: &'a mut ValueSetManager,
15    enum_cache: &'a mut HashMap<String, RustEnum>,
16}
17
18impl<'a> EnumGenerator<'a> {
19    /// Create a new enum generator
20    pub fn new(
21        value_set_manager: &'a mut ValueSetManager,
22        enum_cache: &'a mut HashMap<String, RustEnum>,
23    ) -> Self {
24        Self {
25            value_set_manager,
26            enum_cache,
27        }
28    }
29
30    /// Generate an enum for a value set binding
31    pub fn generate_enum_for_value_set(
32        &mut self,
33        value_set_url: &str,
34    ) -> CodegenResult<Option<RustEnum>> {
35        // Check if we've already generated this enum
36        if let Some(cached_enum) = self.enum_cache.get(value_set_url) {
37            return Ok(Some(cached_enum.clone()));
38        }
39
40        // Generate a placeholder enum using the value set manager
41        let enum_name = self
42            .value_set_manager
43            .generate_placeholder_enum(value_set_url);
44
45        // Register the enum as a ValueSet-based enum in the TypeRegistry
46        TypeRegistry::register_type_classification_only(
47            &enum_name,
48            TypeClassification::ValueSetEnum,
49        );
50
51        // Get the generated enum from the value set manager's cache
52        if let Some(rust_enum) = self.value_set_manager.get_cached_enums().get(&enum_name) {
53            // Cache it in our own cache as well
54            self.enum_cache
55                .insert(value_set_url.to_string(), rust_enum.clone());
56            Ok(Some(rust_enum.clone()))
57        } else {
58            Ok(None)
59        }
60    }
61
62    /// Check if any ValueSet enums have been generated
63    pub fn has_cached_enums(&self) -> bool {
64        !self.value_set_manager.get_cached_enums().is_empty()
65    }
66
67    /// Convert an enum name to a filename using snake_case
68    pub fn enum_name_to_filename(enum_name: &str) -> String {
69        let snake_case_name = crate::naming::Naming::to_snake_case(enum_name);
70        format!("{snake_case_name}.rs")
71    }
72
73    /// Convert an enum name to a module name using snake_case (matching filename)
74    pub fn enum_name_to_module_name(enum_name: &str) -> String {
75        crate::naming::Naming::to_snake_case(enum_name)
76    }
77
78    /// Get all cached enums from the value set manager
79    pub fn get_cached_enums(&self) -> &HashMap<String, RustEnum> {
80        self.value_set_manager.get_cached_enums()
81    }
82}