use std::collections::HashMap;
use crate::generators::type_registry::{TypeClassification, TypeRegistry};
use crate::rust_types::RustEnum;
use crate::value_sets::ValueSetManager;
use crate::CodegenResult;
pub struct EnumGenerator<'a> {
value_set_manager: &'a mut ValueSetManager,
enum_cache: &'a mut HashMap<String, RustEnum>,
}
impl<'a> EnumGenerator<'a> {
pub fn new(
value_set_manager: &'a mut ValueSetManager,
enum_cache: &'a mut HashMap<String, RustEnum>,
) -> Self {
Self {
value_set_manager,
enum_cache,
}
}
pub fn generate_enum_for_value_set(
&mut self,
value_set_url: &str,
) -> CodegenResult<Option<RustEnum>> {
if let Some(cached_enum) = self.enum_cache.get(value_set_url) {
return Ok(Some(cached_enum.clone()));
}
let enum_name = self
.value_set_manager
.generate_placeholder_enum(value_set_url);
TypeRegistry::register_type_classification_only(
&enum_name,
TypeClassification::ValueSetEnum,
);
if let Some(rust_enum) = self.value_set_manager.get_cached_enums().get(&enum_name) {
self.enum_cache
.insert(value_set_url.to_string(), rust_enum.clone());
Ok(Some(rust_enum.clone()))
} else {
Ok(None)
}
}
pub fn has_cached_enums(&self) -> bool {
!self.value_set_manager.get_cached_enums().is_empty()
}
pub fn enum_name_to_filename(enum_name: &str) -> String {
let snake_case_name = crate::naming::Naming::to_snake_case(enum_name);
format!("{snake_case_name}.rs")
}
pub fn enum_name_to_module_name(enum_name: &str) -> String {
crate::naming::Naming::to_snake_case(enum_name)
}
pub fn get_cached_enums(&self) -> &HashMap<String, RustEnum> {
self.value_set_manager.get_cached_enums()
}
}