use edifact_rs::{
ValidationContext, ValidationLayer, Validator, ValidationReport, Segment,
find_qualified_segment, from_bytes, to_bytes, validate_each,
};
struct SimpleValidator;
impl Validator for SimpleValidator {
fn validate_batch(&self, segments: &[Segment<'_>], report: &mut ValidationReport) {
validate_each(segments, report, |_segment| {
Ok(())
});
}
fn set_message_type(&mut self, _msg_type: Option<&str>) {}
}
fn main() -> Result<(), edifact_rs::EdifactError> {
let input = b"UNA:+.? 'UNH+1+ORDERS:D:11A:UN'BGM+220+PO-4711+9'NAD+BY+4000001000002::9'NAD+SU+4000001000001::9'UNT+5+1'";
let segments: Vec<_> = from_bytes(input).collect::<Result<Vec<_>, _>>()?;
let buyer = find_qualified_segment(&segments, "NAD", "BY")
.and_then(|segment| segment.element_str(1))
.unwrap_or("unknown");
let supplier = find_qualified_segment(&segments, "NAD", "SU")
.and_then(|segment| segment.element_str(1))
.unwrap_or("unknown");
println!("buyer={buyer} supplier={supplier}");
let validation_context = ValidationContext::builder()
.with_message_type("ORDERS")
.with_validator(ValidationLayer::Structure, SimpleValidator)
.build();
let report = validation_context.validate_lenient(&segments);
if !report.is_valid() {
return Err(edifact_rs::EdifactError::ValidationFailed {
error_count: report.errors.len(),
first_message: report
.errors
.first()
.map(|issue| issue.message.clone())
.unwrap_or_else(|| "unknown validation issue".to_owned()),
});
}
let output = to_bytes(&segments)?;
let output_text =
String::from_utf8(output).map_err(|_| edifact_rs::EdifactError::InvalidUtf8)?;
println!("roundtrip={output_text}");
Ok(())
}