use fhir::convert;
use fhir::r4::R4;
use fhir::r5::R5;
fn main() {
let stable = serde_json::json!({
"resourceType": "Observation",
"id": "temp-1",
"status": "final",
"code": { "text": "Body temperature" },
"valueQuantity": { "value": 36.6, "unit": "C" }
});
let down = convert::between::<R5, R4>(&stable);
assert!(
down.report.is_lossless(),
"unexpected loss:\n{}",
down.report
);
println!("stable Observation: converted losslessly");
let as_r4: fhir::r4::resources::Resource =
serde_json::from_value(down.value).expect("valid R4 after conversion");
if let fhir::r4::resources::Resource::Observation(obs) = as_r4 {
println!("R4 status: {}", obs.status.code());
}
let mut r5_only = stable.clone();
r5_only["triggeredBy"] = serde_json::json!([
{ "observation": { "reference": "Observation/base-1" }, "type": "reflex" }
]);
let lossy = convert::between::<R5, R4>(&r5_only);
assert!(!lossy.report.is_lossless());
println!("\nR5-only element on the way to R4 — the report:");
println!("{}", lossy.report);
println!(
"discarded data: {} ({} loss(es) recorded)",
lossy.report.discarded_data(),
lossy.report.len(),
);
}