use anyhow::{anyhow, Result}; use std::{fs::File, io::Read}; pub struct LogEntry { pub ts: u64, pub message: Vec, } pub fn load_raw_log(filename: &str) -> Result> { let mut file = File::options() .append(true) .create(true) .read(true) .open(filename)?; let mut ts_buf: [u8; 8] = [0_u8; 8]; let mut len_buf: [u8; 8] = [0_u8; 8]; let mut entries = vec![]; loop { match file.read(&mut ts_buf) { Ok(0) => return Ok(entries), Ok(8) => {} Ok(n) => return Err(anyhow!("got {} of expected 8 bytes for timestamp", n)), Err(e) => return Err(e.into()), }; file.read_exact(&mut len_buf)?; let ts = u64::from_be_bytes(ts_buf); let len = usize::from_be_bytes(len_buf); let mut message = vec![0_u8; len]; file.read_exact(message.as_mut_slice())?; entries.push(LogEntry { ts, message }); } } #[cfg(test)] mod tests { use super::*; #[test] pub fn reads_entries_from_windsynth_log() { let filename = "assets/windsynth.log"; let entries = load_raw_log(filename).unwrap(); assert_eq!(1260, entries.len()); } }