1use onestore::CommitIo;
2use std::io;
3
4pub enum Event {
5 Write(usize, Vec<u8>),
6 Flush,
7}
8
9pub struct Trace {
10 pub bytes: Vec<u8>,
11 pub events: Vec<Event>,
12}
13
14impl CommitIo for Trace {
15 fn read_at(&mut self, offset: u64, output: &mut [u8]) -> io::Result<usize> {
16 let offset = offset as usize;
17 let count = output.len().min(self.bytes.len().saturating_sub(offset));
18 if count != 0 {
19 output[..count].copy_from_slice(&self.bytes[offset..offset + count]);
20 }
21 Ok(count)
22 }
23 fn write_at(&mut self, offset: u64, bytes: &[u8]) -> io::Result<usize> {
24 let offset = offset as usize;
25 let count = bytes.len().min(4096);
26 self.bytes.resize(self.bytes.len().max(offset + count), 0);
27 self.bytes[offset..offset + count].copy_from_slice(&bytes[..count]);
28 self.events
29 .push(Event::Write(offset, bytes[..count].to_vec()));
30 Ok(count)
31 }
32 fn flush(&mut self) -> io::Result<()> {
33 self.events.push(Event::Flush);
34 Ok(())
35 }
36}