const BODY: &[u8] = b"\
BGM+220+PO-4711+9'\
DTM+137:20260401:102'\
NAD+BY+4000001000002::9'\
NAD+SU+4000001000001::9'";
const BODY_SEGMENTS: usize = 4;
fn interchange(target_bytes: usize) -> (Vec<u8>, usize) {
let header = b"UNA:+.? 'UNB+UNOA:1+SENDER+RECEIVER+260401:0900+IC1'UNH+1+ORDERS:D:11A:UN'";
let repetitions = target_bytes / BODY.len() + 1;
let mut payload = Vec::with_capacity(target_bytes + header.len() + 64);
payload.extend_from_slice(header);
for _ in 0..repetitions {
payload.extend_from_slice(BODY);
}
let body_segments = repetitions * BODY_SEGMENTS;
payload.extend_from_slice(format!("UNT+{}+1'", body_segments + 2).as_bytes());
payload.extend_from_slice(b"UNZ+1+IC1'");
(payload, body_segments + 4)
}
fn main() -> Result<(), edifact_rs::EdifactError> {
let (payload, expected_segments) = interchange(10_000_000);
let mut segment_count = 0usize;
for segment in edifact_rs::from_bytes(&payload) {
segment?; segment_count += 1;
}
assert_eq!(
segment_count, expected_segments,
"the parser must see exactly the segments that were written",
);
let segments: Vec<_> = edifact_rs::from_bytes(&payload).collect::<Result<Vec<_>, _>>()?;
let validated = edifact_rs::validate_envelope(&segments)?;
println!(
"payload_bytes={} segment_count={} messages={}",
payload.len(),
segment_count,
validated.message_count(),
);
Ok(())
}