#[cfg(feature = "patient-summary")]
use super::{EPS_BUNDLE, EPS_PATIENT, LOINC, PATIENT_SUMMARY};
#[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Hash)]
pub struct Slot {
pub slice: &'static str,
pub code: &'static str,
pub title: &'static str,
}
impl Slot {
#[must_use]
pub const fn new(slice: &'static str, code: &'static str, title: &'static str) -> Self {
Self { slice, code, title }
}
}
#[cfg(feature = "patient-summary")]
pub const SLOTS: [Slot; 17] = [
Slot::new("sectionProblems", "11450-4", "Problems"),
Slot::new("sectionAllergies", "48765-2", "Allergies and Intolerances"),
Slot::new("sectionMedications", "10160-0", "Medication Summary"),
Slot::new("sectionImmunizations", "11369-6", "Immunizations"),
Slot::new("sectionResults", "30954-2", "Results"),
Slot::new("sectionProceduresHx", "47519-4", "History of Procedures"),
Slot::new("sectionMedicalDevices", "46264-8", "Medical Devices"),
Slot::new("sectionAdvanceDirectives", "42348-3", "Advance Directives"),
Slot::new("sectionAlert", "104605-1", "Alerts"),
Slot::new("sectionFunctionalStatus", "47420-5", "Functional Status"),
Slot::new("sectionPregnancyHx", "10162-6", "History of Pregnancy"),
Slot::new("sectionPatientStory", "81338-6", "Patient Story"),
Slot::new("sectionPlanOfCare", "18776-5", "Plan of Care"),
Slot::new("sectionSocialHistory", "29762-2", "Social History"),
Slot::new("sectionVitalSigns", "8716-3", "Vital Signs"),
Slot::new("sectionTravelHx", "10182-4", "Travel History"),
Slot::new("sectionPatientHx", "11329-0", "Patient History"),
];
#[cfg(feature = "patient-summary")]
#[must_use]
pub fn slot(slice: &str) -> Option<&'static Slot> {
SLOTS.iter().find(|slot| slot.slice == slice)
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Hash)]
pub struct Code {
pub system: &'static str,
pub code: &'static str,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub struct Companion {
pub profile: &'static str,
pub link: &'static str,
pub back: &'static str,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum Kind {
Fixed(Code),
Report {
fallback: Code,
},
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum Authorship {
Gateway,
ReportPerformers,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
#[non_exhaustive]
pub enum SectionRule {
Reasoned {
invariant: &'static str,
slices: &'static [&'static str],
},
Required {
slices: &'static [&'static str],
},
OneOf {
invariant: &'static str,
slices: &'static [&'static str],
},
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub struct Form {
pub bundle: &'static str,
pub composition: &'static str,
pub patient: &'static str,
pub kind: Kind,
pub categories: &'static [Code],
pub authorship: Authorship,
pub slots: &'static [Slot],
pub report: Option<Companion>,
pub encounter: Option<&'static str>,
pub language: bool,
pub rules: &'static [SectionRule],
}
#[cfg(feature = "patient-summary")]
pub const PATIENT_SUMMARY_FORM: Form = Form {
bundle: EPS_BUNDLE,
composition: "http://hl7.eu/fhir/eps/StructureDefinition/composition-eu-eps",
patient: EPS_PATIENT,
kind: Kind::Fixed(Code {
system: LOINC,
code: PATIENT_SUMMARY,
}),
categories: &[],
authorship: Authorship::Gateway,
slots: &SLOTS,
report: None,
encounter: None,
language: false,
rules: &[
SectionRule::Reasoned {
invariant: "ips-comp-1",
slices: &["sectionProblems", "sectionAllergies", "sectionMedications"],
},
SectionRule::Required {
slices: &[
"sectionProblems",
"sectionAllergies",
"sectionMedications",
"sectionProceduresHx",
"sectionMedicalDevices",
],
},
],
};