1use haste_fhir_model::r4::generated::resources::{Resource, SearchParameter};
2use rust_embed::Embed;
3use std::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 = vec![];
19
20 for path in EmbededResourceAssets::iter() {
21 let data = EmbededResourceAssets::get(path.as_ref()).unwrap();
22 let resource = haste_fhir_serialization_json::from_str::<Resource>(
23 str::from_utf8(&data.data).unwrap(),
24 )
25 .expect("Failed to parse artifact parameters JSON");
26 resources.extend(flatten_if_bundle(resource));
27 }
28
29 resources
30}
31
32#[derive(Embed)]
33#[folder = "./artifacts/r4"]
34#[include = "haste_health/**/*.json"]
35#[include = "hl7/minified/**/*.json"]
36#[include = "us-core/**/*.json"]
37
38struct EmbededResourceAssets;
39
40pub static ARTIFACT_RESOURCES: LazyLock<Vec<Box<Resource>>> = LazyLock::new(|| load_resources());
41
42#[derive(Embed)]
43#[folder = "./artifacts/r4"]
44#[include = "haste_health/search_parameter/*.json"]
45#[include = "hl7/minified/search-parameters.min.json"]
46
47struct EmbededSearchParameterAssets;
48
49pub static R4_SEARCH_PARAMETERS: LazyLock<Vec<Box<SearchParameter>>> = LazyLock::new(|| {
51 let mut search_parameters = vec![];
52
53 for path in EmbededSearchParameterAssets::iter() {
54 let data = EmbededSearchParameterAssets::get(path.as_ref()).unwrap();
55 let bundle = haste_fhir_serialization_json::from_str::<Resource>(
56 std::str::from_utf8(&data.data).unwrap(),
57 )
58 .expect("Failed to parse search parameters JSON");
59
60 search_parameters.extend(flatten_if_bundle(bundle).into_iter().filter_map(|r| {
61 if let Resource::SearchParameter(param) = *r {
62 Some(Box::new(param))
63 } else {
64 None
65 }
66 }));
67 }
68
69 search_parameters
70});