Expand description
HL7v2 message parsing in Rust.
Parses the structure of HL7v2 messages, but does not validate the correctness of the messages.
Parsing is centered around the ParsedMessage type.
§Examples
§Parsing a ParsedMessage
use hl7_parser::ParsedMessage;
use std::num::NonZeroUsize;
let message = r#"
MSH|^~\&|AccMgr|1|||20050110045504||ADT^A01|599102|P|2.3|||
PID|1||10006579^^^1^MRN^1||DUCK^DONALD^D||19241010|M||1|111 DUCK ST^^FOWL^CA^999990000^^M|1|8885551212|8885551212|1|2||40007716^^^AccMgr^VN^1|123121234|||||||||||NO NK1|1|DUCK^HUEY|SO|3583 DUCK RD^^FOWL^CA^999990000|8885552222||Y||||||||||||||
PV1|1|I|PREOP^101^1^1^^^S|3|||37^DISNEY^WALT^^^^^^AccMgr^^^^CI|||01||||1|||37^DISNEY^WALT^^^^^^AccMgr^^^^CI|2|40007716^^^AccMgr^VN|4|||||||||||||||||||1||G|||20050110045253||||||
"#;
let message = ParsedMessage::parse(message.trim(), true).expect("can parse message");
let message_type = message.get_field_source(("MSH", 0), NonZeroUsize::new(9).unwrap());
assert_eq!(message_type.unwrap(), "ADT^A01");
§Querying a ParsedMessage
use hl7_parser::ParsedMessage;
let message = include_str!("../test_assets/sample_adt_a01.hl7");
let message = ParsedMessage::parse(&message, true).expect("can parse message");
let trigger_event = message.query_value("MSH.9.2").expect("can parse location query");
assert_eq!(trigger_event, Some("A01"));
§Locating the Cursor Within A ParsedMessage
(The cursor being the character index of some point within the buffer)
use hl7_parser::ParsedMessage;
use std::num::NonZeroUsize;
let message = r#"
MSH|^~\&|AccMgr|1|||20050110045504||ADT^A01|599102|P|2.3|||
PID|1||10006579^^^1^MRN^1||DUCK^DONALD^D||19241010|M||1|111 DUCK ST^^FOWL^CA^999990000^^M|1|8885551212|8885551212|1|2||40007716^^^AccMgr^VN^1|123121234|||||||||||NO NK1|1|DUCK^HUEY|SO|3583 DUCK RD^^FOWL^CA^999990000|8885552222||Y||||||||||||||
PV1|1|I|PREOP^101^1^1^^^S|3|||37^DISNEY^WALT^^^^^^AccMgr^^^^CI|||01||||1|||37^DISNEY^WALT^^^^^^AccMgr^^^^CI|2|40007716^^^AccMgr^VN|4|||||||||||||||||||1||G|||20050110045253||||||
"#;
let message = ParsedMessage::parse(message.trim(), true).expect("can parse message");
let location = message.locate_cursor(25);
assert_eq!(location.segment.unwrap().0, "MSH");
assert_eq!(location.field.unwrap().0.get(), 7);
assert_eq!(location.field.unwrap().1.source(message.source), "20050110045504");
§Parsing ParsedMessage Timestamps
#[cfg(feature = "chrono")]
let ts = "20230312195905-0700";
#[cfg(feature = "chrono")]
let ts = parse_timestamp_chrono(ts)
.expect("can parse timestamp")
.earliest()
.expect("can convert to datetime");
#[cfg(feature = "time")]
let ts = "20230312195905-0700";
#[cfg(feature = "time")]
let ts = parse_timestamp_time(ts).expect("can parse timestamp");
assert_eq!(ts.year(), 2023);
#[cfg(all(feature = "chrono", not(feature = "time")))]
assert_eq!(ts.month(), 3);
#[cfg(feature = "time")]
assert_eq!(ts.month(), time::Month::March);
assert_eq!(ts.day(), 12);
assert_eq!(ts.hour(), 19);
assert_eq!(ts.minute(), 59);
assert_eq!(ts.second(), 05);
§Decoding Encoded Strings
use hl7_parser::Separators;
let separators = Separators::default();
assert_eq!(
separators.decode(r#"Pierre DuRho\S\ne \T\ Cie"#).as_str(),
r#"Pierre DuRho^ne & Cie"#
);
Structs§
- Component
- Represents an HL7v2 sub-component
- Field
- Represents an HL7v2 field
- Located
Data - Results from locating a cursor within a message
- Location
Query - A query for a particular piece of a message, to be used in ParsedMessage::query (or ParsedMessageOwned::query)
- Parsed
Message - A parsed message. The message structure is valid, but the contents may or may not be.
- Parsed
Message Owned - A parsed message that owns its string slice. The message structure is valid, but the contents may or may not be.
- Repeat
- Represents an HL7v2 repeat of a field
- Segment
- Represents an HL7v2 segment
- Segments
- Wrapper around segments; HL7 messages can contain multiple segments of the same type (ex: ORU messages often contain multiple OBX segments)
- Separators
- The separators for the message
- SubComponent
- Represents an HL7v2 sub-component
Enums§
- Parse
Error - Errors that can occur during parsing
- Time
Parse Error - Errors that can occur when parsing timestamps
Traits§
- Component
Accessor - A trait for accessing components on fields, to extend Option<&Repeat> with short-circuit access
- Component
Accessor Mut - A trait for accessing components on fields, to extend Option<&mut Repeat> with short-circuit access
- Field
Accessor - A trait for accessing fields on segments, to extend Option<&Segment> with short-circuit access
- Field
Accessor Mut - A trait for accessing fields on segments, to extend Option<&mut Segment> with short-circuit access
- Repeat
Accessor - A trait for accessing repeat on fields, to extend Option<&Field> with short-circuit access
- Repeat
Accessor Mut - A trait for accessing repeat on fields, to extend Option<&mut Field> with short-circuit access
- SubComponent
Accessor - A trait for accessing sub-components on fields, to extend Option<&Component> with short-circuit access
- SubComponent
Accessor Mut - A trait for accessing sub-components on fields, to extend Option<&mut Component> with short-circuit access
Functions§
- parse_
timestamp_ chrono - Parse an HL7 timestamp
- parse_
timestamp_ time - Parse an HL7 timestamp