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