use serde_json::Value;
pub struct FhirValidationError {
pub field: String,
pub message: String,
}
pub fn validate_inbound_fhir(payload: &Value) -> Result<(), FhirValidationError> {
let obj = payload.as_object().ok_or_else(|| FhirValidationError {
field: "root".to_string(),
message: "Payload is not a JSON object".to_string(),
})?;
let resource_type = obj.get("resourceType").and_then(|v| v.as_str());
if resource_type.is_none() {
return Err(FhirValidationError {
field: "resourceType".to_string(),
message: "Missing required field 'resourceType'".to_string(),
});
}
// Basic check: if it's a Patient, it must have an id (though id can be empty in some drafts,
// for our sync we require a stable identifier)
if resource_type == Some("Patient") {
let id = obj.get("id").and_then(|v| v.as_str());
if id.is_none() || id.is_empty() {
return Err(FhirValidationError {
field: "id".to_string(),
message: "Patient resource must have a non-empty 'id'".to_string(),
});
}
}
Ok(())
}