Skip to main content

haste_artifacts/
lib.rs

1use haste_fhir_model::r4::generated::resources::{Resource, SearchParameter};
2use rust_embed::Embed;
3use std::{collections::HashMap, sync::LazyLock};
4
5fn flatten_if_bundle(resource: Resource) -> Vec<Resource> {
6    match resource {
7        Resource::Bundle(bundle) => bundle
8            .entry
9            .unwrap_or_default()
10            .into_iter()
11            .filter_map(|e| e.resource.map(|r| *r))
12            .collect(),
13        _ => vec![resource],
14    }
15}
16
17fn load_resources() -> Vec<Resource> {
18    let mut resources = HashMap::new();
19
20    for path in EmbededResourceAssets::iter() {
21        let data = EmbededResourceAssets::get(path.as_ref()).unwrap();
22        let resource = serde_json::from_str::<Resource>(str::from_utf8(&data.data).unwrap())
23            .expect("Failed to parse artifact parameters JSON");
24
25        for r in flatten_if_bundle(resource) {
26            let resource_type = r.resource_type();
27            let id = r.id().clone().unwrap_or_else(|| {
28                panic!("Resource in '{}' does not have an ID", path.as_ref());
29            });
30
31            let key = (resource_type, id);
32
33            if resources.contains_key(&key) {
34                println!(
35                    "Duplicate resource ID '{}' '{}' found in '{}'",
36                    key.0.as_ref(),
37                    key.1,
38                    path.as_ref()
39                );
40            }
41
42            resources.insert(key, r);
43        }
44    }
45
46    resources.into_values().collect()
47}
48
49#[derive(Embed)]
50#[folder = "./artifacts"]
51#[include = "r4/haste_health/**/*.json"]
52#[include = "r4/hl7/minified/**/*.json"]
53#[include = "universal/**/*.json"]
54#[include = "r4/r4-to-r5-subscription-backport/**/*.json"]
55struct EmbededResourceAssets;
56
57pub static ARTIFACT_RESOURCES: LazyLock<Vec<Resource>> = LazyLock::new(load_resources);
58
59#[derive(Embed)]
60#[folder = "./artifacts/r4"]
61#[include = "haste_health/search_parameter/*.json"]
62#[include = "hl7/minified/search-parameters.min.json"]
63struct EmbededSearchParameterAssets;
64
65/// System level Search Parameters. These are used for all tenants and projects and are loaded from embedded assets at startup.
66pub static R4_SEARCH_PARAMETERS: LazyLock<Vec<SearchParameter>> =
67    LazyLock::new(|| {
68        let mut search_parameters = Vec::new();
69
70        for path in EmbededSearchParameterAssets::iter() {
71            let data = EmbededSearchParameterAssets::get(path.as_ref()).unwrap();
72
73            let bundle = serde_json::from_str::<Resource>(std::str::from_utf8(&data.data).unwrap())
74                .expect("Failed to parse search parameters JSON");
75
76            search_parameters.extend(flatten_if_bundle(bundle).into_iter().filter_map(
77                |resource| match resource {
78                    Resource::SearchParameter(param) => Some(param),
79                    _ => None,
80                },
81            ));
82        }
83
84        search_parameters
85    });