Skip to main content

haste_operation_executor/
lib.rs

1pub mod providers;
2pub mod structs;
3pub mod traits;
4pub mod validate;
5
6use haste_fhir_model::r4::generated::resources::OperationDefinition;
7use haste_fhir_model::r4::generated::types::{Extension, ExtensionValueTypeChoice};
8
9pub const CUSTOM_CODE_EXTENSION_URL: &str = "https://haste.health/Extension/custom-code";
10pub const CUSTOM_CODE_TYPE_EXTENSION_URL: &str = "https://haste.health/Extension/custom-code-type";
11
12pub(crate) fn extract_code_from_operation_definition(
13    operation: &OperationDefinition,
14) -> Option<(&str, &str)> {
15    let code_extension = operation.extension.as_ref()?.iter().find(|extension| {
16        extension.url == CUSTOM_CODE_EXTENSION_URL
17            && extension_value_as_string(extension.as_ref()).is_some()
18    })?;
19
20    let code = extension_value_as_string(code_extension.as_ref())?;
21
22    let media_type = code_extension
23        .extension
24        .as_ref()?
25        .iter()
26        .find(|extension| extension.url == CUSTOM_CODE_TYPE_EXTENSION_URL)
27        .and_then(|extension| extension_value_as_string(extension.as_ref()))?;
28
29    Some((code, media_type))
30}
31
32fn extension_value_as_string(extension: &Extension) -> Option<&str> {
33    match extension.value.as_ref()? {
34        ExtensionValueTypeChoice::String(value) => value.value.as_deref(),
35        _ => None,
36    }
37}