use std::fs::File;
use std::io::{self, BufReader, Cursor};
use edi_energy::{EdiEnergyMessage, ParseConfig, Parser};
const FIXTURE: &[u8] = b"\
UNB+UNOC:3+9900357000004:500+4012345000023:14+260701:0900+INTER-R-001'\
UNH+MSG-001+UTILMD:D:11A:UN:S2.1'\
BGM+E01+00055002'\
DTM+137:202607010900?+00:303'\
NAD+MS+9900357000004::293'\
NAD+MR+4012345000023::9'\
IDE+24+VORGANG0002'\
DTM+92:202610010000?+00:303'\
STS+7++E01+ZW7'\
STS+E01++A51:E_0623'\
LOC+Z16+51238696012'\
LOC+Z17+DE00056266802AO6G56M11SN51G21M24S'\
RFF+Z13:55002'\
RFF+TN:VORGANG0001'\
RFF+Z60:1'\
SEQ+Z98'\
CCI+++ZB3'\
CAV+Z91:9903456000009::Z39:Z19'\
SEQ+ZF3'\
RFF+Z19:DE00056266802AO6G56M11SN51G21M24S'\
CCI+++ZB3'\
CAV+Z91:9903456000009::Z39:Z19'\
CAV+ZF0:9903456000009'\
UNT+23+MSG-001'\
UNZ+1+INTER-R-001'";
fn main() -> Result<(), Box<dyn std::error::Error>> {
let args: Vec<String> = std::env::args().collect();
let file_path: Option<&str> = args
.windows(2)
.find(|w| w[0] == "--file")
.map(|w| w[1].as_str());
let msg = if let Some(path) = file_path {
println!("Reading from file: {path}");
let file = File::open(path)?;
let reader = BufReader::new(file);
Parser::new().parse_reader(reader)?
} else {
println!("Using embedded fixture (pass --file <path> to read from disk)");
Parser::new().parse_reader(Cursor::new(FIXTURE))?
};
println!(
"\nMessage type : {}",
msg.try_message_type()
.map(|t| t.as_str().to_owned())
.unwrap_or_else(|| "Unknown".to_owned())
);
println!(
"PID : {}",
msg.detect_pruefidentifikator()?.as_u32()
);
println!("Release : {}", msg.detect_release()?.as_str());
let raw_bytes = msg.serialize()?;
let config = ParseConfig {
max_segment_bytes: 4096, ..ParseConfig::default()
};
let msg2 = Parser::with_config(config).parse(&raw_bytes)?;
assert_eq!(
msg2.try_message_type(),
msg.try_message_type(),
"type mismatch after config round-trip"
);
println!("\nRound-trip via ParseConfig: OK");
let report = msg.validate()?;
println!(
"Validation : {}",
if report.is_valid() { "OK" } else { "FAILED" }
);
println!(" : {report}");
for issue in report.errors() {
println!(
" : [{}] {}",
issue.rule_id.as_deref().unwrap_or("-"),
issue.message
);
}
assert!(
file_path.is_some() || report.is_valid(),
"the embedded fixture must pass the AHB",
);
println!("\nSerialized output:");
println!("{}", "-".repeat(60));
let out = io::stdout();
io::Write::write_all(&mut out.lock(), &raw_bytes)?;
println!("\n{}", "-".repeat(60));
Ok(())
}