51 lines
1.2 KiB
Rust
51 lines
1.2 KiB
Rust
use anyhow::{anyhow, Result};
|
|
use std::{fs::File, io::Read};
|
|
|
|
pub struct LogEntry {
|
|
pub ts: u64,
|
|
pub message: Vec<u8>,
|
|
}
|
|
|
|
pub fn load_raw_log(filename: &str) -> Result<Vec<LogEntry>> {
|
|
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());
|
|
}
|
|
}
|