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}