1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
use std::io;

use error::*;
use types::*;

pub struct Writer<R> {
    buffer: R,
}

impl<R: io::Write> Writer<R> {
    pub fn new(inner: R) -> Self {
        Writer {
            buffer: inner
        }
    }

    pub fn write_snapshot(&mut self, snapshot: &Snapshot) -> Result<()> {
        self.buffer.write(snapshot.size().to_string().as_bytes())?;
        self.buffer.write(b"\n")?;
        self.buffer.write(snapshot.comment.as_bytes())?;
        self.buffer.write(b"\n")?;
        for atom in &snapshot.atoms {
            self.buffer.write(atom.to_string().as_bytes())?;
            self.buffer.write(b"\n")?;
        }
        self.buffer.flush()?;
        Ok(())
    }
}

#[cfg(test)]
mod tests {
    use super::*;
    use ::types::*;

    #[test]
    fn test_write() {
        let mut buffer: Vec<u8> = vec![];
        {
            let mut writer = Writer::new(&mut buffer);
            let result = writer.write_snapshot(&Snapshot{
                comment: "comment".to_string(),
                atoms: vec![
                    Atom::new("C", 10.2, 13.4,  8.9),
                    Atom::new("N",  3.1, 10.8, 13.6),
                    Atom::new("H",  5.7, 13.4,  4.6),
                ],
            });
            assert!(result.is_ok());
        }
        let string = String::from_utf8(buffer);
        assert!(string.is_ok());
        assert_eq!("3\n\
                    comment\n\
                    C 10.2 13.4 8.9\n\
                    N 3.1 10.8 13.6\n\
                    H 5.7 13.4 4.6\n",
                    string.unwrap());
    }
}