midi-keys/src/log.rs

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());
}
}