Skip to main content

haste_artifacts/
lib.rs

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