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<Box<Resource>> {
6 match resource {
7 Resource::Bundle(bundle) => bundle
8 .entry
9 .unwrap_or(vec![])
10 .into_iter()
11 .flat_map(|e| e.resource)
12 .collect::<Vec<_>>(),
13 _ => vec![Box::new(resource)],
14 }
15}
16
17fn load_resources() -> Vec<Box<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 flatten_if_bundle(resource).into_iter().for_each(|r| {
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/r4"]
51#[include = "haste_health/**/*.json"]
52#[include = "hl7/minified/**/*.json"]
53#[include = "r4-to-r5-subscription-backport/**/*.json"]
54struct EmbededResourceAssets;
55
56pub static ARTIFACT_RESOURCES: LazyLock<Vec<Box<Resource>>> = LazyLock::new(|| load_resources());
57
58#[derive(Embed)]
59#[folder = "./artifacts/r4"]
60#[include = "haste_health/search_parameter/*.json"]
61#[include = "hl7/minified/search-parameters.min.json"]
62
63struct EmbededSearchParameterAssets;
64
65pub static R4_SEARCH_PARAMETERS: LazyLock<Vec<Box<SearchParameter>>> = LazyLock::new(|| {
67 let mut search_parameters = vec![];
68
69 for path in EmbededSearchParameterAssets::iter() {
70 let data = EmbededSearchParameterAssets::get(path.as_ref()).unwrap();
71 let bundle = serde_json::from_str::<Resource>(std::str::from_utf8(&data.data).unwrap())
72 .expect("Failed to parse search parameters JSON");
73
74 search_parameters.extend(flatten_if_bundle(bundle).into_iter().filter_map(|r| {
75 if let Resource::SearchParameter(param) = *r {
76 Some(Box::new(param))
77 } else {
78 None
79 }
80 }));
81 }
82
83 search_parameters
84});