use buf_redux::{policy::MinBuffered, BufReader};
use dlt_core::parse::{dlt_message, DltParseError};
use std::{env, fs, fs::File, io::BufRead, path::PathBuf, time::Instant};
const BIN_READER_CAPACITY: usize = 10 * 1024 * 1024;
const BIN_MIN_BUFFER_SPACE: usize = 10 * 1024;
fn main() {
let dlt_file_path = PathBuf::from(&env::args().nth(1).expect("No filename given"));
let dlt_file = File::open(&dlt_file_path).expect("could not open file");
let source_file_size = fs::metadata(&dlt_file_path).expect("file size error").len();
let mut reader = BufReader::with_capacity(BIN_READER_CAPACITY, dlt_file)
.set_policy(MinBuffered(BIN_MIN_BUFFER_SPACE));
let mut parsed = 0usize;
let start = Instant::now();
loop {
let consumed: usize = match reader.fill_buf() {
Ok(content) => {
if content.is_empty() {
println!("empty content after {} parsed messages", parsed);
break;
}
let available = content.len();
match dlt_message(content, None, true) {
Ok((rest, _maybe_msg)) => {
let consumed = available - rest.len();
parsed += 1;
consumed
}
Err(DltParseError::IncompleteParse { needed }) => {
println!("parse incomplete, needed: {:?}", needed);
return;
}
Err(DltParseError::ParsingHickup(reason)) => {
println!("parse error: {}", reason);
4 }
Err(DltParseError::Unrecoverable(cause)) => {
println!("unrecoverable parse failure: {}", cause);
return;
}
}
}
Err(e) => {
println!("Error reading: {}", e);
return;
}
};
reader.consume(consumed);
}
let duration_in_s = start.elapsed().as_millis() as f64 / 1000.0;
let file_size_in_mb = source_file_size as f64 / 1024.0 / 1024.0;
let amount_per_second: f64 = file_size_in_mb / duration_in_s;
println!(
"parsing {} messages took {:.3}s! ({:.3} MB/s)",
parsed, duration_in_s, amount_per_second
);
}