#![warn(missing_docs)]
mod component;
mod encoding;
mod error;
mod field;
pub mod helper;
mod message;
mod segment;
mod sub_component;
pub use component::Component;
pub use encoding::HL7Encoding;
pub use error::Hl7Error;
pub use field::Field;
pub use message::Message;
pub use segment::Segment;
pub use sub_component::SubComponent;
#[cfg(doctest)]
#[doc = include_str!("../README.md")]
struct ReadmeDoctests;
#[cfg(test)]
mod tests {
use super::*;
const SAMPLE: &str = "MSH|^~\\&|SendingApp|SendingFac|ReceivingApp|ReceivingFac|20200101120000||ADT^A01^ADT_A01|MSGID1234|P|2.5\r\
PID|1||PATID1234^5^M11^ADT1^MR^GOOD HEALTH HOSPITAL~123456789^^^USSSA^SS||EVERYMAN^ADAM^A^III||19610615|M\r\
NK1|1|NUCLEAR^NELDA^W|SPO^SPOUSE\r";
fn parsed() -> Message {
let mut m = Message::with_message(SAMPLE);
assert!(m.parse(false).unwrap(), "message should round-trip");
m
}
#[test]
fn parses_and_extracts_metadata() {
let m = parsed();
assert_eq!(m.version, "2.5");
assert_eq!(m.message_structure, "ADT_A01");
assert_eq!(m.message_control_id, "MSGID1234");
assert_eq!(m.processing_id, "P");
assert_eq!(m.segment_count, 3);
}
#[test]
fn round_trip_serialization_matches() {
let m = parsed();
assert_eq!(m.serialize().unwrap(), SAMPLE);
}
#[test]
fn get_value_paths() {
let m = parsed();
assert_eq!(m.get_value("MSH.9").unwrap(), "ADT^A01^ADT_A01");
assert_eq!(m.get_value("MSH.9.1").unwrap(), "ADT");
assert_eq!(m.get_value("MSH.9.3").unwrap(), "ADT_A01");
assert_eq!(m.get_value("PID.5.1").unwrap(), "EVERYMAN");
assert_eq!(m.get_value("PID.5.2").unwrap(), "ADAM");
assert_eq!(m.get_value("PID.3.4").unwrap(), "ADT1");
}
#[test]
fn flags() {
let m = parsed();
assert!(m.is_componentized("PID.5").unwrap());
assert!(m.has_repetitions("PID.3").unwrap());
assert!(!m.is_componentized("PID.1").unwrap());
}
#[test]
fn set_value_updates_tree() {
let mut m = parsed();
assert!(m.set_value("PID.5.1", "SMITH").unwrap());
assert_eq!(m.get_value("PID.5.1").unwrap(), "SMITH");
assert!(m.serialize().unwrap().contains("SMITH^ADAM"));
}
#[test]
fn encode_decode_round_trip() {
let enc = HL7Encoding::default();
let raw = "Smith & Sons | ^Special^";
let encoded = enc.encode(raw);
assert!(encoded.contains("\\T\\")); assert!(encoded.contains("\\F\\")); assert!(encoded.contains("\\S\\")); assert_eq!(enc.decode(&encoded), raw);
}
#[test]
fn present_but_null() {
let enc = HL7Encoding::default();
let sub = SubComponent::new("\"\"");
assert_eq!(sub.value(&enc), None);
assert_eq!(enc.encode_opt(None), "\"\"");
}
#[test]
fn ack_generation() {
let m = parsed();
let ack = m.get_ack(false).expect("ack");
assert_eq!(ack.message_structure, "ACK");
assert_eq!(ack.get_value("MSH.3").unwrap(), "ReceivingApp");
assert_eq!(ack.get_value("MSH.5").unwrap(), "SendingApp");
assert_eq!(ack.get_value("MSA.1").unwrap(), "AA");
assert_eq!(ack.get_value("MSA.2").unwrap(), "MSGID1234");
}
#[test]
fn mllp_framing() {
let m = parsed();
let framed = m.get_mllp().unwrap();
assert_eq!(framed[0], 0x0B);
assert_eq!(framed[framed.len() - 2], 0x1C);
assert_eq!(framed[framed.len() - 1], 0x0D);
}
}