1use std::fs;
4use std::io::{BufWriter, Write};
5use std::path::Path;
6
7use byteorder::{LittleEndian, WriteBytesExt};
8
9use point::Point;
10use result::Result;
11
12#[derive(Debug)]
14pub struct Writer<W: Write> {
15 writer: W,
16}
17
18impl Writer<BufWriter<fs::File>> {
19 pub fn from_path<P: AsRef<Path>>(path: P) -> Result<Writer<BufWriter<fs::File>>> {
33 let writer = BufWriter::new(try!(fs::File::create(path)));
34 Writer::new(writer)
35 }
36}
37
38impl<W: Write> Writer<W> {
39 pub fn new(mut writer: W) -> Result<Writer<W>> {
53 try!(writer.write_u32::<LittleEndian>(8));
54 try!(writer.write_u16::<LittleEndian>(5));
56 try!(writer.write_u16::<LittleEndian>(0));
57 Ok(Writer { writer: writer })
58 }
59
60 pub fn write_point(&mut self, point: &Point) -> Result<()> {
75 try!(self.writer.write_f64::<LittleEndian>(point.time));
76 try!(self.writer.write_f32::<LittleEndian>(point.range));
77 try!(self.writer.write_f32::<LittleEndian>(point.theta));
78 try!(self.writer.write_f32::<LittleEndian>(point.x));
79 try!(self.writer.write_f32::<LittleEndian>(point.y));
80 try!(self.writer.write_f32::<LittleEndian>(point.z));
81 try!(self.writer.write_u16::<LittleEndian>(point.amplitude));
82 try!(self.writer.write_u16::<LittleEndian>(point.width));
83 try!(self.writer.write_u8(point.target_type.as_u8()));
84 try!(self.writer.write_u8(point.target));
85 try!(self.writer.write_u8(point.num_target));
86 try!(self.writer.write_u16::<LittleEndian>(point.rg_index));
87 try!(self.writer.write_u8(point.channel_desc_byte()));
88 Ok(())
89 }
90}