use edifact_rs::{
__private::find_qualified_segment, Segment, ValidationContext, ValidationLayer,
ValidationReport, ValidationRuleContext, Validator, from_bytes, segments_to_bytes,
validate_each,
};
struct SimpleValidator;
impl Validator for SimpleValidator {
fn validate_batch(
&self,
segments: &[Segment<'_>],
report: &mut ValidationReport,
_context: &ValidationRuleContext<'_>,
) {
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 = segments_to_bytes(&segments)?;
let output_text =
String::from_utf8(output).map_err(|_| edifact_rs::EdifactError::InvalidUtf8)?;
println!("roundtrip={output_text}");
Ok(())
}