use ::serde::de::DeserializeOwned;
use ::serde_json::Value;
use crate::r5::meta;
pub use crate::xml::{to_xml, XmlError};
pub fn from_xml<T: DeserializeOwned>(xml: &str) -> Result<T, XmlError> {
crate::xml::from_xml(meta::elements(), xml)
}
pub fn xml_to_value(xml: &str) -> Result<Value, XmlError> {
crate::xml::xml_to_value(meta::elements(), xml)
}
#[cfg(test)]
mod tests {
use super::*;
use crate::r5::resources::{Observation, Patient};
fn roundtrip_patient(json: ::serde_json::Value) {
let patient: Patient = ::serde_json::from_value(json).unwrap();
let xml = to_xml(&patient, "Patient");
let back: Patient = from_xml(&xml).unwrap_or_else(|e| panic!("from_xml failed: {e}\n{xml}"));
assert_eq!(back, patient, "\nXML was:\n{xml}");
}
#[test]
fn patient_roundtrips() {
roundtrip_patient(::serde_json::json!({
"resourceType": "Patient",
"id": "pat-1",
"active": true,
"gender": "male",
"birthDate": "1970-03-25",
"name": [{ "family": "Chalmers", "given": ["Peter", "James"] }],
"telecom": [{ "system": "phone", "value": "555" }]
}));
}
#[test]
fn primitive_written_as_value_attribute() {
let patient: Patient = ::serde_json::from_value(::serde_json::json!({
"resourceType": "Patient", "active": true
}))
.unwrap();
let xml = to_xml(&patient, "Patient");
assert!(xml.contains("<active value=\"true\"/>"), "{xml}");
assert!(xml.contains("xmlns=\"http://hl7.org/fhir\""), "{xml}");
}
#[test]
fn choice_element_roundtrips() {
let obs: Observation = ::serde_json::from_value(::serde_json::json!({
"resourceType": "Observation",
"status": "final",
"code": { "text": "temp" },
"valueString": "warm"
}))
.unwrap();
let xml = to_xml(&obs, "Observation");
let back: Observation = from_xml(&xml).unwrap_or_else(|e| panic!("{e}\n{xml}"));
assert_eq!(back, obs, "\nXML was:\n{xml}");
}
}