use std::fs::File;
use std::io::{self, BufReader, Cursor};
use edi_energy::{EdiEnergyMessage, ParseConfig, Parser};
const FIXTURE: &[u8] = b"\
UNB+UNOC:3+4012345000023:14+9900357000004:14+240115:0800+INTER-R-001'\
UNH+MSG-001+MSCONS:D:04B:UN:2.4c'\
BGM+7:::+00013002::+9'\
DTM+137:20240115:102'\
NAD+MS+4012345000023::293'\
NAD+MR+9900357000004::293'\
UNS+D'\
LOC+172+51238696781'\
LIN+1'\
PIA+5+1-1:1.29.0:SRW'\
QTY+220:1234.567:KWH'\
STS+Z32'\
STS+Z40'\
UNT+13+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}");
println!("\nSerialized output:");
println!("{}", "-".repeat(60));
let out = io::stdout();
io::Write::write_all(&mut out.lock(), &raw_bytes)?;
println!("\n{}", "-".repeat(60));
Ok(())
}