wraited_struct/
lib.rs

1
2use std::{io, mem, slice};
3
4
5
6/// Read `T` with byte array
7///
8/// # Example
9///
10/// ```
11/// extern crate wraited_struct;
12/// use std::fs::File;
13///
14/// #[derive(Debug)]
15/// struct Something {
16///     a: u8,
17///     b: u16,
18///     c: u32,
19/// }
20///
21/// fn main() {
22///     let mut file = File::open("something.bin").unwrap();
23///     let something = wraited_struct::read::<Something, File>(&mut file).unwrap();
24///     println!("{:?}", something);
25/// }
26/// ```
27pub unsafe fn read<T, R: io::Read>(reader: &mut R) -> io::Result<T> {
28    // http://stackoverflow.com/questions/25410028/how-to-read-a-struct-from-a-file-in-rust
29    let num_bytes = mem::size_of::<T>();
30    let mut result: T = mem::uninitialized();
31    let buffer: &mut [u8] = slice::from_raw_parts_mut(&mut result as *mut T as *mut u8, num_bytes);
32    match reader.read_exact(buffer) {
33        Ok(()) => Ok(result),
34        Err(e) => {
35            mem::forget(result);
36            Err(e)
37        }
38    }
39}
40
41
42/// Write `T` with byte array
43///
44/// # Example
45///
46/// ```
47/// extern crate wraited_struct;
48/// use std::fs::File;
49///
50/// struct Something {
51///     a: u8,
52///     b: u16,
53///     c: u32,
54/// }
55///
56/// fn main() {
57///     let mut file = File::create("something.bin").unwrap();
58///     wraited_struct::write::<Something, File>(&mut file, Something { a: 97, b: 98, c: 99 }).unwrap();
59/// }
60/// ```
61pub unsafe fn write<T, W: io::Write>(writer: &mut W, mut value: T) -> io::Result<usize> {
62    let num_bytes = mem::size_of::<T>();
63    let buffer: &mut [u8] = slice::from_raw_parts_mut(&mut value as *mut T as *mut u8, num_bytes);
64    writer.write(buffer)
65}