sdc/
writer.rs

1//! Object for creating .sdc files.
2
3use 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/// An .sdc writer.
13#[derive(Debug)]
14pub struct Writer<W: Write> {
15    writer: W,
16}
17
18impl Writer<BufWriter<fs::File>> {
19    /// Creates a new SDC file and opens it for writing.
20    ///
21    /// The file will be closed when the file goes out of scope.
22    ///
23    /// # Examples
24    ///
25    /// ```
26    /// use std::fs::remove_file;
27    /// use sdc::writer::Writer;
28    /// {
29    ///     let writer = Writer::from_path("temp.sdc").unwrap();
30    /// }
31    /// remove_file("temp.sdc").unwrap();
32    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    /// Creates a new writer, consuming the provided `Write`.
40    ///
41    /// # Examples
42    ///
43    /// ```
44    /// # use std::fs::remove_file;
45    /// use std::fs::File;
46    /// use sdc::writer::Writer;
47    /// let writer = File::create("temp.sdc").unwrap();
48    /// {
49    ///     let writer = Writer::new(writer).unwrap();
50    /// }
51    /// # remove_file("temp.sdc").unwrap();
52    pub fn new(mut writer: W) -> Result<Writer<W>> {
53        try!(writer.write_u32::<LittleEndian>(8));
54        // TODO hardcoded version, make this smahtar.
55        try!(writer.write_u16::<LittleEndian>(5));
56        try!(writer.write_u16::<LittleEndian>(0));
57        Ok(Writer { writer: writer })
58    }
59
60    /// Writes a point to this SDC file.
61    ///
62    /// # Examples
63    ///
64    /// ```
65    /// # use std::fs::remove_file;
66    /// use sdc::writer::Writer;
67    /// use sdc::point::Point;
68    /// let ref point = Point::new();
69    /// {
70    ///     let mut file = Writer::from_path("temp.sdc").unwrap();
71    ///     file.write_point(point).unwrap();
72    /// }
73    /// # remove_file("temp.sdc").unwrap();
74    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}