1use super::message::{MessageBuf, MessageError};
3use std::fs::File;
4
5pub trait LogSliceReader {
7 type Result: 'static;
9
10 fn read_from(
17 &mut self,
18 file: &File,
19 file_position: u32,
20 bytes: usize,
21 ) -> Result<Self::Result, MessageError>;
22}
23
24#[cfg(unix)]
25#[derive(Default, Copy, Clone)]
26pub struct MessageBufReader;
28
29impl LogSliceReader for MessageBufReader {
30 type Result = MessageBuf;
31
32 fn read_from(
33 &mut self,
34 file: &File,
35 file_position: u32,
36 bytes: usize,
37 ) -> Result<Self::Result, MessageError> {
38 use std::os::unix::fs::FileExt;
39
40 let mut vec = vec![0; bytes];
41 file.read_at(&mut vec, u64::from(file_position))?;
42 MessageBuf::from_bytes(vec)
43 }
44}