Skip to main content

haste_artifacts/
lib.rs

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
49/// System level Search Parameters. These are used for all tenants and projects and are loaded from embedded assets at startup.
50pub 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});