#![allow(dead_code)]
use std::collections::HashMap;
use std::path::Path;
use crate::config::CodegenConfig;
use crate::fhir_types::StructureDefinition;
use crate::generators::token_generator::TokenGenerator;
#[cfg(test)]
use crate::generators::ImportManager;
use crate::generators::{
EnumGenerator, FieldGenerator, FileGenerator, FileIoManager, NestedStructGenerator,
PrimitiveGenerator, StructGenerator, TraitGenerator, TypeRegistry, TypeUtilities,
};
use crate::rust_types::{RustEnum, RustStruct, RustTrait};
use crate::value_sets::ValueSetManager;
use crate::CodegenResult;
pub use crate::generators::file_generator::FhirTypeCategory;
pub struct CodeGenerator {
config: CodegenConfig,
type_cache: HashMap<String, RustStruct>,
enum_cache: HashMap<String, RustEnum>,
value_set_manager: ValueSetManager,
token_generator: TokenGenerator,
}
impl CodeGenerator {
#[allow(dead_code)] pub fn new(config: CodegenConfig) -> Self {
let value_set_manager = ValueSetManager::new();
let token_generator = TokenGenerator::new();
Self {
config,
type_cache: HashMap::new(),
enum_cache: HashMap::new(),
value_set_manager,
token_generator,
}
}
pub fn new_with_value_set_directory<P: AsRef<Path>>(
config: CodegenConfig,
value_set_dir: P,
) -> Self {
let value_set_manager = ValueSetManager::new_with_directory(value_set_dir);
let token_generator = TokenGenerator::new();
Self {
config,
type_cache: HashMap::new(),
enum_cache: HashMap::new(),
value_set_manager,
token_generator,
}
}
pub fn load_structure_definition<P: AsRef<Path>>(
&self,
path: P,
) -> CodegenResult<StructureDefinition> {
FileIoManager::load_structure_definition(path)
}
pub fn generate_struct(
&mut self,
structure_def: &StructureDefinition,
) -> CodegenResult<RustStruct> {
TypeRegistry::register_from_structure_definition(structure_def);
let mut struct_generator = StructGenerator::new(
&self.config,
&mut self.type_cache,
&mut self.value_set_manager,
);
let rust_struct = struct_generator.generate_struct(structure_def)?;
Ok(rust_struct)
}
pub fn generate_trait(
&mut self,
structure_def: &StructureDefinition,
) -> CodegenResult<Vec<RustTrait>> {
let crate_lib_name = self
.config
.crate_name
.as_deref()
.map(|n| n.replace('-', "_"))
.unwrap_or_else(|| "hl7_fhir_r4_core".to_string());
let mut trait_generator = TraitGenerator::new_with_crate_name(crate_lib_name);
let mut traits = Vec::new();
let categories = ["Accessors", "Mutators", "Existence"];
for category in &categories {
let rust_trait = trait_generator.generate_trait(structure_def, category)?;
traits.push(rust_trait);
}
Ok(traits)
}
fn generate_primitive_type_struct(
&mut self,
structure_def: &StructureDefinition,
rust_struct: RustStruct,
) -> CodegenResult<RustStruct> {
let mut primitive_generator = PrimitiveGenerator::new(&self.config, &mut self.type_cache);
primitive_generator.generate_primitive_type_struct(structure_def, rust_struct)
}
fn generate_primitive_type_alias(
&self,
structure_def: &StructureDefinition,
) -> CodegenResult<crate::rust_types::RustTypeAlias> {
let mut temp_cache = HashMap::new();
let primitive_generator = PrimitiveGenerator::new(&self.config, &mut temp_cache);
primitive_generator.generate_primitive_type_alias(structure_def)
}
fn generate_primitive_element_struct(
&mut self,
structure_def: &StructureDefinition,
) -> CodegenResult<RustStruct> {
let mut primitive_generator = PrimitiveGenerator::new(&self.config, &mut self.type_cache);
primitive_generator.generate_primitive_element_struct(structure_def)
}
fn generate_nested_struct(
&mut self,
parent_struct_name: &str,
nested_field_name: &str,
nested_elements: &[crate::fhir_types::ElementDefinition],
parent_structure_def: &StructureDefinition,
) -> CodegenResult<Option<crate::rust_types::RustStruct>> {
let mut nested_struct_generator = NestedStructGenerator::new(
&self.config,
&mut self.type_cache,
&mut self.value_set_manager,
);
nested_struct_generator.generate_nested_struct(
parent_struct_name,
nested_field_name,
nested_elements,
parent_structure_def,
)
}
fn create_field_from_element(
&mut self,
element: &crate::fhir_types::ElementDefinition,
) -> CodegenResult<Option<crate::rust_types::RustField>> {
let mut field_generator =
FieldGenerator::new(&self.config, &self.type_cache, &mut self.value_set_manager);
field_generator.create_field_from_element(element)
}
fn to_rust_field_name(&self, name: &str) -> String {
crate::naming::Naming::field_name(name)
}
pub fn generate_to_organized_directories<P: AsRef<Path>>(
&mut self,
structure_def: &StructureDefinition,
base_output_dir: P,
) -> CodegenResult<()> {
let rust_struct = self.generate_struct(structure_def)?;
let nested_structs =
FileIoManager::collect_nested_structs(&rust_struct.name, &self.type_cache);
let file_io_manager = FileIoManager::new(&self.config, &self.token_generator);
file_io_manager.generate_to_organized_directories(
structure_def,
base_output_dir,
&rust_struct,
&nested_structs,
)
}
pub fn generate_trait_to_organized_directory<P: AsRef<Path>>(
&mut self,
structure_def: &StructureDefinition,
base_output_dir: P,
) -> CodegenResult<()> {
let rust_traits = self.generate_trait(structure_def)?;
let file_io_manager = FileIoManager::new(&self.config, &self.token_generator);
file_io_manager.generate_traits_to_organized_directory(
structure_def,
base_output_dir.as_ref(),
&rust_traits,
)
}
pub fn classify_fhir_structure_def(
&self,
structure_def: &StructureDefinition,
) -> FhirTypeCategory {
let file_generator = FileGenerator::new(&self.config, &self.token_generator);
file_generator.classify_fhir_structure_def(structure_def)
}
fn is_fhir_datatype(&self, name: &str) -> bool {
TypeUtilities::is_fhir_datatype(name)
}
pub fn generate_to_file<P: AsRef<Path>>(
&mut self,
structure_def: &StructureDefinition,
output_path: P,
) -> CodegenResult<()> {
if structure_def.kind == "primitive-type" {
let empty_struct = RustStruct::new("".to_string());
let nested_structs = vec![];
let file_io_manager = FileIoManager::new(&self.config, &self.token_generator);
file_io_manager.generate_to_file(
structure_def,
output_path,
&empty_struct,
&nested_structs,
)
} else {
let rust_struct = self.generate_struct(structure_def)?;
let nested_structs =
FileIoManager::collect_nested_structs(&rust_struct.name, &self.type_cache);
let file_io_manager = FileIoManager::new(&self.config, &self.token_generator);
file_io_manager.generate_to_file(
structure_def,
output_path,
&rust_struct,
&nested_structs,
)
}
}
pub fn generate_trait_to_file<P: AsRef<Path>>(
&mut self,
structure_def: &StructureDefinition,
output_path: P,
) -> CodegenResult<()> {
let rust_traits = self.generate_trait(structure_def)?;
let file_io_manager = FileIoManager::new(&self.config, &self.token_generator);
file_io_manager.generate_traits_to_file(
structure_def,
output_path.as_ref(),
&rust_traits,
)?;
Ok(())
}
pub fn pre_register_value_set_enums<P: AsRef<Path>>(
&mut self,
package_dir: P,
) -> CodegenResult<()> {
let package_path = package_dir.as_ref();
if !package_path.exists() {
return Ok(()); }
let entries = match std::fs::read_dir(package_path) {
Ok(entries) => entries,
Err(_) => return Ok(()), };
for entry in entries {
let entry = match entry {
Ok(entry) => entry,
Err(_) => continue, };
let path = entry.path();
if !path.is_file() || path.extension().is_none_or(|ext| ext != "json") {
continue;
}
let content = match std::fs::read_to_string(&path) {
Ok(content) => content,
Err(_) => continue, };
let json_value: serde_json::Value = match serde_json::from_str(&content) {
Ok(value) => value,
Err(_) => continue, };
if json_value.get("resourceType").and_then(|v| v.as_str()) != Some("ValueSet") {
continue;
}
if let Some(url) = json_value.get("url").and_then(|v| v.as_str()) {
let enum_name = self.value_set_manager.generate_enum_name(url);
crate::generators::type_registry::TypeRegistry::register_type_classification_only(
&enum_name,
crate::generators::type_registry::TypeClassification::ValueSetEnum,
);
}
}
Ok(())
}
pub fn generate_enum_files<P: AsRef<Path>>(&mut self, enums_dir: P) -> CodegenResult<()> {
let enum_generator = EnumGenerator::new(&mut self.value_set_manager, &mut self.enum_cache);
let token_generator = crate::generators::token_generator::TokenGenerator::new();
let file_generator = FileGenerator::new(&self.config, &token_generator);
file_generator.generate_enum_files(enums_dir, &enum_generator)
}
pub fn generate_enums_mod_file<P: AsRef<Path>>(&self, enums_dir: P) -> CodegenResult<()> {
let mut value_set_manager = self.value_set_manager.clone(); let mut enum_cache = self.enum_cache.clone();
let enum_generator = EnumGenerator::new(&mut value_set_manager, &mut enum_cache);
let file_generator = FileGenerator::new(&self.config, &self.token_generator);
file_generator.generate_enums_mod_file(enums_dir, &enum_generator)
}
pub fn generate_enum_for_value_set(
&mut self,
value_set_url: &str,
) -> CodegenResult<Option<RustEnum>> {
let mut enum_generator =
EnumGenerator::new(&mut self.value_set_manager, &mut self.enum_cache);
let result = enum_generator.generate_enum_for_value_set(value_set_url)?;
Ok(result)
}
pub fn has_cached_enums(&self) -> bool {
TypeUtilities::has_cached_enums(&self.value_set_manager)
}
pub fn to_filename(&self, structure_def: &StructureDefinition) -> String {
crate::naming::Naming::filename(structure_def)
}
pub fn generate_trait_file_from_trait<P: AsRef<Path>>(
&self,
rust_trait: &RustTrait,
output_path: P,
) -> CodegenResult<()> {
let file_generator = FileGenerator::new(&self.config, &self.token_generator);
file_generator.generate_trait_file_from_trait(rust_trait, output_path)
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_to_valid_rust_identifier_conversion() {
assert_eq!(
crate::naming::Naming::to_rust_identifier("StructureDefinition"),
"StructureDefinition"
);
assert_eq!(
crate::naming::Naming::to_rust_identifier("Patient"),
"Patient"
);
assert_eq!(
crate::naming::Naming::to_rust_identifier("Observation"),
"Observation"
);
assert_eq!(
crate::naming::Naming::to_rust_identifier("CodeSystem"),
"CodeSystem"
);
assert_eq!(
crate::naming::Naming::to_rust_identifier("patient"),
"patient"
);
assert_eq!(
crate::naming::Naming::to_rust_identifier("Relative Date Criteria"),
"RelativeDateCriteria"
);
assert_eq!(
crate::naming::Naming::to_rust_identifier("Care Plan"),
"CarePlan"
);
assert_eq!(
crate::naming::Naming::to_rust_identifier("patient-name"),
"PatientName"
);
assert_eq!(
crate::naming::Naming::to_rust_identifier("patient_name"),
"patient_name"
);
assert_eq!(
crate::naming::Naming::to_rust_identifier("some-complex_name with.spaces"),
"SomeComplexNameWithSpaces"
);
assert_eq!(crate::naming::Naming::to_rust_identifier(""), "_");
assert_eq!(crate::naming::Naming::to_rust_identifier(" "), "_");
assert_eq!(crate::naming::Naming::to_rust_identifier("a"), "a");
}
#[test]
fn test_logical_model_skipping() {
use crate::fhir_types::StructureDefinition;
let config = CodegenConfig::default();
let mut generator = CodeGenerator::new(config);
let logical_model = StructureDefinition {
resource_type: "StructureDefinition".to_string(),
id: "test-logical-model".to_string(),
url: "http://example.org/fhir/StructureDefinition/test-logical-model".to_string(),
name: "test-logical-model".to_string(),
title: Some("Test Logical Model".to_string()),
status: "active".to_string(),
kind: "logical".to_string(),
is_abstract: false,
description: Some("A test logical model".to_string()),
purpose: None,
base_type: "Base".to_string(),
base_definition: Some("http://hl7.org/fhir/StructureDefinition/Base".to_string()),
version: None,
differential: None,
snapshot: None,
};
let result = generator.generate_struct(&logical_model);
assert!(result.is_err());
if let Err(crate::CodegenError::Generation { message }) = result {
assert!(message.contains("Skipping LogicalModel"));
assert!(message.contains("test-logical-model"));
} else {
panic!("Expected CodegenError::Generation for LogicalModel");
}
}
#[test]
fn test_nested_struct_generation() {
use crate::fhir_types::{
ElementDefinition, ElementType, StructureDefinition, StructureDefinitionDifferential,
};
let config = CodegenConfig::default();
let mut generator = CodeGenerator::new(config);
let bundle_structure = StructureDefinition {
resource_type: "StructureDefinition".to_string(),
id: "Bundle".to_string(),
url: "http://hl7.org/fhir/StructureDefinition/Bundle".to_string(),
name: "Bundle".to_string(),
title: Some("Bundle".to_string()),
status: "active".to_string(),
kind: "resource".to_string(),
is_abstract: false,
description: Some("A container for a collection of resources".to_string()),
purpose: None,
base_type: "Bundle".to_string(),
base_definition: Some("http://hl7.org/fhir/StructureDefinition/Resource".to_string()),
version: None,
differential: Some(StructureDefinitionDifferential {
element: vec![
ElementDefinition {
id: Some("Bundle.entry".to_string()),
path: "Bundle.entry".to_string(),
short: Some("Entry in the bundle".to_string()),
definition: None,
min: Some(0),
max: Some("*".to_string()),
element_type: Some(vec![ElementType {
code: Some("BackboneElement".to_string()),
target_profile: None,
}]),
fixed: None,
pattern: None,
binding: None,
constraint: None,
},
ElementDefinition {
id: Some("Bundle.entry.resource".to_string()),
path: "Bundle.entry.resource".to_string(),
short: Some("A resource in the bundle".to_string()),
definition: None,
min: Some(0),
max: Some("1".to_string()),
element_type: Some(vec![ElementType {
code: Some("Resource".to_string()),
target_profile: None,
}]),
fixed: None,
pattern: None,
binding: None,
constraint: None,
},
],
}),
snapshot: None,
};
let result = generator.generate_struct(&bundle_structure);
assert!(result.is_ok());
let bundle_struct = result.unwrap();
assert_eq!(bundle_struct.name, "Bundle");
let entry_field = bundle_struct.fields.iter().find(|f| f.name == "entry");
assert!(entry_field.is_some(), "Bundle should have an entry field");
assert!(
generator.type_cache.contains_key("BundleEntry"),
"BundleEntry struct should be generated"
);
let bundle_entry_struct = generator.type_cache.get("BundleEntry").unwrap();
assert_eq!(bundle_entry_struct.name, "BundleEntry");
let resource_field = bundle_entry_struct
.fields
.iter()
.find(|f| f.name == "resource");
assert!(
resource_field.is_some(),
"BundleEntry should have a resource field"
);
}
#[test]
fn test_primitive_type_naming() {
use crate::fhir_types::StructureDefinition;
let primitive_structure = StructureDefinition {
resource_type: "StructureDefinition".to_string(),
id: "string".to_string(),
url: "http://hl7.org/fhir/StructureDefinition/string".to_string(),
name: "string".to_string(),
title: Some("string".to_string()),
status: "active".to_string(),
kind: "primitive-type".to_string(),
is_abstract: false,
description: Some("A sequence of Unicode characters".to_string()),
purpose: None,
base_type: "string".to_string(),
base_definition: Some("http://hl7.org/fhir/StructureDefinition/Element".to_string()),
version: None,
differential: None,
snapshot: None,
};
let struct_name = crate::naming::Naming::struct_name(&primitive_structure);
assert_eq!(
struct_name, "string",
"Primitive type 'string' should not be capitalized"
);
let filename = crate::naming::Naming::filename(&primitive_structure);
assert_eq!(
filename, "string.rs",
"Primitive type filename should not be capitalized"
);
let boolean_structure = StructureDefinition {
resource_type: "StructureDefinition".to_string(),
id: "boolean".to_string(),
url: "http://hl7.org/fhir/StructureDefinition/boolean".to_string(),
name: "boolean".to_string(),
title: Some("boolean".to_string()),
status: "active".to_string(),
kind: "primitive-type".to_string(),
is_abstract: false,
description: Some("Value of 'true' or 'false'".to_string()),
purpose: None,
base_type: "boolean".to_string(),
base_definition: Some("http://hl7.org/fhir/StructureDefinition/Element".to_string()),
version: None,
differential: None,
snapshot: None,
};
let struct_name = crate::naming::Naming::struct_name(&boolean_structure);
assert_eq!(
struct_name, "boolean",
"Primitive type 'boolean' should not be capitalized"
);
let complex_structure = StructureDefinition {
resource_type: "StructureDefinition".to_string(),
id: "Period".to_string(),
url: "http://hl7.org/fhir/StructureDefinition/Period".to_string(),
name: "Period".to_string(),
title: Some("Period".to_string()),
status: "active".to_string(),
kind: "complex-type".to_string(),
is_abstract: false,
description: Some("A time period defined by a start and end date".to_string()),
purpose: None,
base_type: "Period".to_string(),
base_definition: Some("http://hl7.org/fhir/StructureDefinition/Element".to_string()),
version: None,
differential: None,
snapshot: None,
};
let struct_name = crate::naming::Naming::struct_name(&complex_structure);
assert_eq!(
struct_name, "Period",
"Complex type 'Period' should be capitalized"
);
}
#[test]
fn test_primitive_type_generation() {
use crate::fhir_types::StructureDefinition;
use crate::rust_types::RustType;
let config = CodegenConfig::default();
let mut generator = CodeGenerator::new(config);
let uri_structure = StructureDefinition {
resource_type: "StructureDefinition".to_string(),
id: "uri".to_string(),
url: "http://hl7.org/fhir/StructureDefinition/uri".to_string(),
name: "uri".to_string(),
title: Some("uri".to_string()),
status: "active".to_string(),
kind: "primitive-type".to_string(),
is_abstract: false,
description: Some(
"String of characters used to identify a name or a resource".to_string(),
),
purpose: None,
base_type: "uri".to_string(),
base_definition: Some("http://hl7.org/fhir/StructureDefinition/Element".to_string()),
version: None,
differential: None,
snapshot: None,
};
let type_alias_result = generator.generate_primitive_type_alias(&uri_structure);
assert!(
type_alias_result.is_ok(),
"Should generate primitive type alias successfully"
);
let uri_type_alias = type_alias_result.unwrap();
assert_eq!(
uri_type_alias.name, "UriType",
"Primitive type alias should use PascalCase with Type suffix"
);
if let RustType::String = uri_type_alias.target_type {
} else {
panic!(
"URI primitive type alias should target String, got: {:?}",
uri_type_alias.target_type
);
}
let boolean_structure = StructureDefinition {
resource_type: "StructureDefinition".to_string(),
id: "boolean".to_string(),
url: "http://hl7.org/fhir/StructureDefinition/boolean".to_string(),
name: "boolean".to_string(),
title: Some("boolean".to_string()),
status: "active".to_string(),
kind: "primitive-type".to_string(),
is_abstract: false,
description: Some("Value of 'true' or 'false'".to_string()),
purpose: None,
base_type: "boolean".to_string(),
base_definition: Some("http://hl7.org/fhir/StructureDefinition/Element".to_string()),
version: None,
differential: None,
snapshot: None,
};
let type_alias_result = generator.generate_primitive_type_alias(&boolean_structure);
assert!(
type_alias_result.is_ok(),
"Should generate boolean primitive type alias successfully"
);
let boolean_type_alias = type_alias_result.unwrap();
if let RustType::Boolean = boolean_type_alias.target_type {
} else {
panic!(
"Boolean primitive type alias should target bool, got: {:?}",
boolean_type_alias.target_type
);
}
let element_struct = generator.generate_primitive_element_struct(&uri_structure);
assert!(
element_struct.is_ok(),
"Should generate companion Element struct successfully"
);
let element_struct = element_struct.unwrap();
assert_eq!(
element_struct.name, "_uri",
"Companion Element struct should be named '_uri'"
);
assert_eq!(
element_struct.base_definition,
Some("Element".to_string()),
"Companion Element struct should inherit from Element"
);
}
#[test]
fn test_trait_generation() {
use crate::fhir_types::{
ElementDefinition, ElementType, StructureDefinition, StructureDefinitionDifferential,
};
let config = CodegenConfig::default();
let mut generator = CodeGenerator::new(config);
let patient_structure = StructureDefinition {
resource_type: "StructureDefinition".to_string(),
id: "Patient".to_string(),
url: "http://hl7.org/fhir/StructureDefinition/Patient".to_string(),
name: "Patient".to_string(),
title: Some("Patient".to_string()),
status: "active".to_string(),
kind: "resource".to_string(),
is_abstract: false,
description: Some("Demographics and other administrative information about an individual receiving care.".to_string()),
purpose: None,
base_type: "DomainResource".to_string(),
base_definition: Some("http://hl7.org/fhir/StructureDefinition/DomainResource".to_string()),
version: None,
differential: Some(StructureDefinitionDifferential {
element: vec![
ElementDefinition {
id: Some("Patient.active".to_string()),
path: "Patient.active".to_string(),
short: Some("Whether this patient record is in active use".to_string()),
definition: Some("Whether this patient record is in active use".to_string()),
min: Some(0),
max: Some("1".to_string()),
element_type: Some(vec![ElementType {
code: Some("boolean".to_string()),
target_profile: None,
}]),
fixed: None,
pattern: None,
binding: None,
constraint: None,
},
ElementDefinition {
id: Some("Patient.name".to_string()),
path: "Patient.name".to_string(),
short: Some("A name associated with the patient".to_string()),
definition: Some("A name associated with the patient".to_string()),
min: Some(0),
max: Some("*".to_string()),
element_type: Some(vec![ElementType {
code: Some("HumanName".to_string()),
target_profile: None,
}]),
fixed: None,
pattern: None,
binding: None,
constraint: None,
},
],
}),
snapshot: None,
};
let result = generator.generate_trait(&patient_structure);
assert!(result.is_ok(), "Should generate Patient trait successfully");
let patient_traits = result.unwrap();
let patient_trait = patient_traits
.iter()
.find(|t| t.name == "PatientAccessors")
.expect("PatientAccessors trait not found");
assert_eq!(
patient_trait.name, "PatientAccessors",
"Trait should be named 'PatientAccessors'"
);
assert!(
patient_trait
.super_traits
.contains(&"DomainResourceAccessors".to_string()),
"Patient trait should inherit from DomainResourceAccessors"
);
let has_extensions = patient_trait.methods.iter().any(|m| m.name == "extensions");
assert!(
!has_extensions,
"Patient trait should NOT have extensions method - it should be inherited from Resource"
);
let has_narrative = patient_trait.methods.iter().any(|m| m.name == "narrative");
assert!(
!has_narrative,
"Patient trait should NOT have narrative method - it should be inherited from DomainResource"
);
let has_id = patient_trait.methods.iter().any(|m| m.name == "id");
assert!(
!has_id,
"Patient trait should NOT have id method - it should be inherited from Resource"
);
}
#[test]
fn test_filename_generation() {
let patient_structure = StructureDefinition {
resource_type: "StructureDefinition".to_string(),
id: "Patient".to_string(),
url: "http://hl7.org/fhir/StructureDefinition/Patient".to_string(),
name: "Patient".to_string(),
title: Some("Patient".to_string()),
status: "active".to_string(),
kind: "resource".to_string(),
is_abstract: false,
description: Some("A patient resource".to_string()),
purpose: None,
base_type: "DomainResource".to_string(),
base_definition: Some(
"http://hl7.org/fhir/StructureDefinition/DomainResource".to_string(),
),
version: None,
differential: None,
snapshot: None,
};
let observation_structure = StructureDefinition {
resource_type: "StructureDefinition".to_string(),
id: "Observation".to_string(),
url: "http://hl7.org/fhir/StructureDefinition/Observation".to_string(),
name: "Observation".to_string(),
title: Some("Observation".to_string()),
status: "active".to_string(),
kind: "resource".to_string(),
is_abstract: false,
description: Some("An observation resource".to_string()),
purpose: None,
base_type: "DomainResource".to_string(),
base_definition: Some(
"http://hl7.org/fhir/StructureDefinition/DomainResource".to_string(),
),
version: None,
differential: None,
snapshot: None,
};
let patient_struct_name = crate::naming::Naming::struct_name(&patient_structure);
assert_eq!(patient_struct_name, "Patient");
let observation_struct_name = crate::naming::Naming::struct_name(&observation_structure);
assert_eq!(observation_struct_name, "Observation");
let patient_filename = crate::naming::Naming::filename(&patient_structure);
assert_eq!(patient_filename, "patient.rs");
let observation_filename = crate::naming::Naming::filename(&observation_structure);
assert_eq!(observation_filename, "observation.rs");
let structure_definition = StructureDefinition {
resource_type: "StructureDefinition".to_string(),
id: "StructureDefinition".to_string(),
url: "http://hl7.org/fhir/StructureDefinition/StructureDefinition".to_string(),
name: "StructureDefinition".to_string(),
title: Some("StructureDefinition".to_string()),
status: "active".to_string(),
kind: "resource".to_string(),
is_abstract: false,
description: Some("A structure definition".to_string()),
purpose: None,
base_type: "DomainResource".to_string(),
base_definition: Some(
"http://hl7.org/fhir/StructureDefinition/DomainResource".to_string(),
),
version: None,
differential: None,
snapshot: None,
};
let struct_def_struct_name = crate::naming::Naming::struct_name(&structure_definition);
assert_eq!(struct_def_struct_name, "StructureDefinition");
let struct_def_filename = crate::naming::Naming::filename(&structure_definition);
assert_eq!(struct_def_filename, "structure_definition.rs");
let enum_filename = crate::naming::Naming::enum_filename("AdministrativeGender");
assert_eq!(enum_filename, "administrative_gender.rs");
let enum_module_name = crate::naming::Naming::module_name("AdministrativeGender");
assert_eq!(enum_module_name, "administrative_gender");
}
#[test]
fn test_import_classification() {
assert!(ImportManager::is_fhir_resource_type("DomainResource"));
assert!(ImportManager::is_fhir_resource_type("Patient"));
assert!(ImportManager::is_fhir_resource_type("ActivityDefinition"));
assert!(!ImportManager::is_fhir_resource_type("Identifier"));
assert!(ImportManager::is_fhir_datatype("Identifier"));
assert!(ImportManager::is_fhir_datatype("CodeableConcept"));
assert!(ImportManager::is_fhir_datatype("Reference"));
assert!(!ImportManager::is_fhir_datatype("DomainResource"));
assert_eq!(
ImportManager::get_import_path_for_type("DomainResource"),
"crate::resources::domain_resource::DomainResource"
);
assert_eq!(
ImportManager::get_import_path_for_type("Identifier"),
"crate::datatypes::identifier::Identifier"
);
assert_eq!(
ImportManager::get_import_path_for_type("PublicationStatus"),
"crate::bindings::publication_status::PublicationStatus"
);
}
}