rusty_chunkenc/encoder/
chunks_encoder.rs

1use crate::chunks::ChunksDiskFormat;
2
3impl ChunksDiskFormat {
4    pub fn write<W: std::io::Write>(&self, writer: &mut W) -> std::io::Result<()> {
5        // start with the magic code, the version, and the padding
6        writer.write_all(&[0x85, 0xBD, 0x40, 0xDD, 1, 0, 0, 0])?;
7
8        if self.chunks().is_empty() {
9            return Err(std::io::Error::new(
10                std::io::ErrorKind::InvalidData,
11                "at least one chunk is required",
12            ));
13        }
14
15        // Write all the chunks one by one
16        for chunk in self.chunks() {
17            chunk.write(writer)?;
18        }
19        Ok(())
20    }
21}
22
23#[cfg(test)]
24mod tests {
25
26    use crate::{read_chunks, Chunk, XORSample};
27
28    use super::*;
29
30    #[test]
31    fn test_write_chunks_disk_format() {
32        let chunk_disk_format = ChunksDiskFormat::new(
33            vec![
34                Chunk::new_xor(vec![
35                    XORSample {
36                        timestamp: 7200000,
37                        value: 12000.0,
38                    },
39                    XORSample {
40                        timestamp: 7201000,
41                        value: 12001.0,
42                    },
43                ]),
44                Chunk::new_xor(vec![
45                    XORSample {
46                        timestamp: 7200000,
47                        value: 123.45,
48                    },
49                    XORSample {
50                        timestamp: 7201000,
51                        value: 123.46,
52                    },
53                ]),
54            ],
55            None,
56        );
57
58        // Serialise the chunks
59        let mut buffer: Vec<u8> = Vec::new();
60        chunk_disk_format.write(&mut buffer).unwrap();
61
62        // Parse a chunk from a buffer
63        let (_, parsed_chunk_disk_format) = read_chunks(&buffer, None).unwrap();
64        println!("parsed_chunks: {:?}", parsed_chunk_disk_format);
65        assert_eq!(parsed_chunk_disk_format, chunk_disk_format);
66    }
67
68    #[test]
69    fn test_without_chunks() {
70        let chunk_disk_format = ChunksDiskFormat::new(vec![], None);
71
72        // Serialise the chunks
73        let mut buffer: Vec<u8> = Vec::new();
74        let error = chunk_disk_format.write(&mut buffer).unwrap_err();
75        assert!(error.to_string().contains("at least one chunk is required"));
76    }
77}