1#![allow(missing_docs)]
2
3use std::io::{Read, Seek, SeekFrom, Write};
4use sync_file::ReadAt;
5use zerocopy::{FromBytes, FromZeros, IntoBytes};
6
7pub fn read_struct_at<T: FromBytes + IntoBytes, R: ReadAt>(
8 r: &R,
9 offset: u64,
10) -> std::io::Result<T> {
11 let mut value = T::new_zeroed();
12 r.read_exact_at(value.as_mut_bytes(), offset)?;
13 Ok(value)
14}
15
16pub fn read_struct<T: FromBytes + IntoBytes, R: Read>(r: &mut R) -> std::io::Result<T> {
17 let mut value: T = T::new_zeroed();
18 let value_bytes = value.as_mut_bytes();
19 r.read_exact(value_bytes)?;
20 Ok(value)
21}
22
23pub fn read_boxed_slice<T: FromBytes + IntoBytes, R: Read>(
24 r: &mut R,
25 n: usize,
26) -> std::io::Result<Box<[T]>> {
27 let mut value = <[T]>::new_box_zeroed_with_elems(n).unwrap();
28 r.read_exact(value.as_mut_bytes())?;
29 Ok(value)
30}
31
32pub fn read_boxed_slice_at<T: FromBytes + IntoBytes, R: ReadAt>(
33 r: &mut R,
34 offset: u64,
35 n: usize,
36) -> std::io::Result<Box<[T]>> {
37 let mut value = <[T]>::new_box_zeroed_with_elems(n).unwrap();
38 r.read_exact_at(value.as_mut_bytes(), offset)?;
39 Ok(value)
40}
41
42pub fn write_at<W: Write + Seek>(w: &mut W, pos: u64, data: &[u8]) -> std::io::Result<()> {
43 w.seek(SeekFrom::Start(pos))?;
44 w.write_all(data)
45}