use serde_json::Value;
use fhir_r4::observation::Observation;
use crate::{SatuSehatConfig, SatuSehatError};
pub struct SatuSehatObservation {
inner: Observation,
organization_id: String,
}
impl SatuSehatObservation {
pub fn from_observation(obs: Observation, config: &SatuSehatConfig) -> Self {
Self {
inner: obs,
organization_id: config.organization_id.clone(),
}
}
pub fn to_json(&self) -> Result<String, SatuSehatError> {
let mut value = serde_json::to_value(&self.inner)?;
if let Value::Object(ref mut map) = value {
map.insert(
"meta".to_string(),
serde_json::json!({
"profile": [
"https://api-satusehat.kemkes.go.id/fhir/StructureDefinition/Observation-vital-signs"
]
}),
);
if !map.contains_key("performer") {
map.insert(
"performer".to_string(),
serde_json::json!([{
"reference": format!("Organization/{}", self.organization_id)
}]),
);
}
}
serde_json::to_string_pretty(&value).map_err(Into::into)
}
}
#[cfg(test)]
mod tests {
use super::*;
use fhir_r4::observation::{ObservationBuilder, ObservationStatus};
use crate::{SatuSehatConfig, SatuSehatEnv};
#[test]
fn adds_satusehat_profile() {
let config = SatuSehatConfig {
env: SatuSehatEnv::Sandbox,
client_id: "test".to_string(),
client_secret: "test".to_string(),
organization_id: "org-001".to_string(),
};
let obs = ObservationBuilder::new()
.status(ObservationStatus::Final)
.loinc_code("59408-5", "Oxygen saturation")
.value_quantity(98.0, "%")
.build();
let ss = SatuSehatObservation::from_observation(obs, &config);
let json = ss.to_json().unwrap();
assert!(json.contains("satusehat"));
assert!(json.contains("org-001"));
}
}