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
65pub 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 });