rh-codegen 0.2.1

Code generation library for creating Rust types from FHIR StructureDefinitions
Documentation
use criterion::{criterion_group, criterion_main, Criterion};
use rh_codegen::{CodeGenerator, CodegenConfig, StructureDefinition};

fn make_structure_defs() -> Vec<StructureDefinition> {
    let base_defs = vec![
        ("Patient", "resource", "DomainResource"),
        ("Observation", "resource", "DomainResource"),
        ("Condition", "resource", "DomainResource"),
        ("Practitioner", "resource", "DomainResource"),
        ("Organization", "resource", "DomainResource"),
        ("Identifier", "complex-type", "Element"),
        ("HumanName", "complex-type", "Element"),
        ("Address", "complex-type", "Element"),
        ("CodeableConcept", "complex-type", "Element"),
        ("Quantity", "complex-type", "Element"),
        ("string", "primitive-type", "Element"),
        ("integer", "primitive-type", "Element"),
        ("boolean", "primitive-type", "Element"),
        ("decimal", "primitive-type", "Element"),
        ("uri", "primitive-type", "Element"),
    ];

    base_defs
        .into_iter()
        .map(|(name, kind, base)| StructureDefinition {
            resource_type: "StructureDefinition".to_string(),
            id: name.to_string(),
            url: format!("http://hl7.org/fhir/StructureDefinition/{name}"),
            name: name.to_string(),
            title: Some(name.to_string()),
            status: "active".to_string(),
            kind: kind.to_string(),
            is_abstract: false,
            description: Some(format!("FHIR {name}")),
            purpose: None,
            base_type: base.to_string(),
            base_definition: Some(format!("http://hl7.org/fhir/StructureDefinition/{base}")),
            version: None,
            differential: None,
            snapshot: None,
        })
        .collect()
}

fn bench_generate_single_struct(c: &mut Criterion) {
    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("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,
    };

    rh_codegen::generators::type_registry::TypeRegistry::register_from_structure_definition(
        &patient_structure,
    );

    c.bench_function("generate_struct_patient", |b| {
        b.iter(|| {
            let _ = generator.generate_struct(&patient_structure);
        })
    });
}

fn bench_generate_structs_sequential(c: &mut Criterion) {
    let structure_defs = make_structure_defs();
    for sd in &structure_defs {
        rh_codegen::generators::type_registry::TypeRegistry::register_from_structure_definition(sd);
    }

    c.bench_function("generate_structs_sequential_14_defs", |b| {
        b.iter(|| {
            let config = CodegenConfig::default();
            let mut generator = CodeGenerator::new(config);
            for sd in &structure_defs {
                let _ = generator.generate_struct(sd);
            }
        })
    });
}

fn bench_generate_structs_parallel(c: &mut Criterion) {
    let structure_defs = make_structure_defs();
    for sd in &structure_defs {
        rh_codegen::generators::type_registry::TypeRegistry::register_from_structure_definition(sd);
    }

    c.bench_function("generate_structs_parallel_14_defs", |b| {
        b.iter(|| {
            let config = CodegenConfig::default();
            let generator = CodeGenerator::new(config);
            let _ = generator.generate_structs_parallel(&structure_defs);
        })
    });
}

fn bench_type_registry_registration(c: &mut Criterion) {
    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,
    };

    c.bench_function("type_registry_register", |b| {
        b.iter(|| {
            rh_codegen::generators::type_registry::TypeRegistry::register_from_structure_definition(
                &patient_structure,
            );
        })
    });
}

criterion_group!(
    benches,
    bench_generate_single_struct,
    bench_generate_structs_sequential,
    bench_generate_structs_parallel,
    bench_type_registry_registration
);
criterion_main!(benches);