rh_codegen/generators/
enum_generator.rs1use 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
12pub 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 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 pub fn generate_enum_for_value_set(
32 &mut self,
33 value_set_url: &str,
34 ) -> CodegenResult<Option<RustEnum>> {
35 if let Some(cached_enum) = self.enum_cache.get(value_set_url) {
37 return Ok(Some(cached_enum.clone()));
38 }
39
40 let enum_name = self
42 .value_set_manager
43 .generate_placeholder_enum(value_set_url);
44
45 TypeRegistry::register_type_classification_only(
47 &enum_name,
48 TypeClassification::ValueSetEnum,
49 );
50
51 if let Some(rust_enum) = self.value_set_manager.get_cached_enums().get(&enum_name) {
53 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 pub fn has_cached_enums(&self) -> bool {
64 !self.value_set_manager.get_cached_enums().is_empty()
65 }
66
67 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 pub fn enum_name_to_module_name(enum_name: &str) -> String {
75 crate::naming::Naming::to_snake_case(enum_name)
76 }
77
78 pub fn get_cached_enums(&self) -> &HashMap<String, RustEnum> {
80 self.value_set_manager.get_cached_enums()
81 }
82}