#![forbid(unsafe_code)]
use er7::{Component, RenderOptions, Repetition, Subcomponent, Terminator};
fn main() -> Result<(), er7::Error> {
let text = "MSH|^~\\&|LAB|ACME|EHR|CLINIC|20260815081500||ADT^A08|MSG1|P|2.5\r\
PID|1||444333222^^^ACME^MR||SMITH^JOHN||19800101|M";
let mut message = er7::parse(text)?;
assert_eq!(message.to_er7(), text);
let separators = message.separators;
message
.segment_at_mut("PID", 1)
.and_then(|segment| segment.field_mut(5))
.and_then(|field| field.repetition_mut(1))
.and_then(|repetition| repetition.component_mut(1))
.and_then(|component| component.subcomponent_mut(1))
.expect("PID-5.1 was sent")
.set("O'BRIEN & SONS", &separators);
assert!(message.to_er7().contains(r"O'BRIEN \T\ SONS^JOHN"));
assert_eq!(message.query("PID-5.1")?.as_deref(), Some("O'BRIEN & SONS"));
println!("edited name: {}", message.query("PID-5")?.unwrap());
assert_eq!(er7::parse(&message.to_er7())?, message);
let mut careless = er7::parse(text)?;
careless
.segment_at_mut("PID", 1)
.and_then(|segment| segment.field_mut(5))
.and_then(|field| field.repetition_mut(1))
.and_then(|repetition| repetition.component_mut(1))
.and_then(|component| component.subcomponent_mut(1))
.expect("PID-5.1 was sent")
.raw = "O'BRIEN & SONS".to_string();
assert_eq!(
careless
.segment("PID")
.and_then(|segment| segment.component(5, 1))
.map(|component| component.subcomponents.len()),
Some(1)
);
let reparsed = er7::parse(&careless.to_er7())?;
assert_eq!(
reparsed
.segment("PID")
.and_then(|segment| segment.component(5, 1))
.map(|component| component.subcomponents.len()),
Some(2)
);
println!("careless edit split one component into two — use `set`");
message
.segment_at_mut("PID", 1)
.and_then(|segment| segment.field_mut(5))
.expect("PID-5 was sent")
.repetitions
.push(Repetition {
components: vec![Component {
subcomponents: vec![Subcomponent::new("OBRIEN")],
}],
});
assert_eq!(
message.query("PID-5")?.as_deref(),
Some(r"O'BRIEN & SONS^JOHN~OBRIEN")
);
let note = er7::parse_with("NTE|1||Name corrected.", separators)
.segments
.remove(0);
message.segments.push(note);
assert_eq!(message.query("NTE-3")?.as_deref(), Some("Name corrected."));
let wire = message.to_er7_with(RenderOptions {
terminator: Terminator::Cr,
trailing_terminator: true,
});
assert!(wire.ends_with('\r'));
let readable = message.to_er7_with(RenderOptions {
terminator: Terminator::Lf,
trailing_terminator: true,
});
print!("{readable}");
println!("ok");
Ok(())
}