use edifact_primitives::{Control, EdifactDelimiters, RawSegment};
use crate::ParseError;
pub trait EdifactHandler {
fn on_delimiters(&mut self, _delimiters: &EdifactDelimiters, _explicit_una: bool) {}
fn on_interchange_start(&mut self, _unb: &RawSegment) -> Control {
Control::Continue
}
fn on_message_start(&mut self, _unh: &RawSegment) -> Control {
Control::Continue
}
fn on_segment(&mut self, _segment: &RawSegment) -> Control {
Control::Continue
}
fn on_message_end(&mut self, _unt: &RawSegment) {}
fn on_interchange_end(&mut self, _unz: &RawSegment) {}
fn on_error(&mut self, _error: ParseError) -> Control {
Control::Stop
}
}
#[cfg(test)]
mod tests {
use super::*;
use edifact_primitives::SegmentPosition;
struct RecordingHandler {
events: Vec<String>,
}
impl RecordingHandler {
fn new() -> Self {
Self { events: Vec::new() }
}
}
impl EdifactHandler for RecordingHandler {
fn on_delimiters(&mut self, _delimiters: &EdifactDelimiters, explicit_una: bool) {
self.events
.push(format!("delimiters(una={})", explicit_una));
}
fn on_interchange_start(&mut self, unb: &RawSegment) -> Control {
self.events.push(format!("interchange_start({})", unb.id));
Control::Continue
}
fn on_message_start(&mut self, unh: &RawSegment) -> Control {
self.events.push(format!("message_start({})", unh.id));
Control::Continue
}
fn on_segment(&mut self, segment: &RawSegment) -> Control {
self.events.push(format!("segment({})", segment.id));
Control::Continue
}
fn on_message_end(&mut self, unt: &RawSegment) {
self.events.push(format!("message_end({})", unt.id));
}
fn on_interchange_end(&mut self, unz: &RawSegment) {
self.events.push(format!("interchange_end({})", unz.id));
}
}
#[test]
fn test_default_handler_compiles() {
struct EmptyHandler;
impl EdifactHandler for EmptyHandler {}
let mut handler = EmptyHandler;
let pos = SegmentPosition::new(1, 0, 0);
let seg = RawSegment::new("UNB", vec![], pos);
handler.on_delimiters(&EdifactDelimiters::default(), false);
assert_eq!(handler.on_interchange_start(&seg), Control::Continue);
assert_eq!(handler.on_message_start(&seg), Control::Continue);
assert_eq!(handler.on_segment(&seg), Control::Continue);
handler.on_message_end(&seg);
handler.on_interchange_end(&seg);
}
#[test]
fn test_recording_handler() {
let mut handler = RecordingHandler::new();
let pos = SegmentPosition::new(1, 0, 0);
handler.on_delimiters(&EdifactDelimiters::default(), true);
handler.on_interchange_start(&RawSegment::new("UNB", vec![], pos));
handler.on_segment(&RawSegment::new("UNB", vec![], pos));
assert_eq!(handler.events.len(), 3);
assert_eq!(handler.events[0], "delimiters(una=true)");
assert_eq!(handler.events[1], "interchange_start(UNB)");
assert_eq!(handler.events[2], "segment(UNB)");
}
#[test]
fn test_handler_stop_control() {
struct StopOnSecondSegment {
count: usize,
}
impl EdifactHandler for StopOnSecondSegment {
fn on_segment(&mut self, _segment: &RawSegment) -> Control {
self.count += 1;
if self.count >= 2 {
Control::Stop
} else {
Control::Continue
}
}
}
let mut handler = StopOnSecondSegment { count: 0 };
let pos = SegmentPosition::new(1, 0, 1);
assert_eq!(
handler.on_segment(&RawSegment::new("BGM", vec![], pos)),
Control::Continue
);
assert_eq!(
handler.on_segment(&RawSegment::new("DTM", vec![], pos)),
Control::Stop
);
}
}