rusty_chunkenc/encoder/
chunks_encoder.rs1use crate::chunks::ChunksDiskFormat;
2
3impl ChunksDiskFormat {
4 pub fn write<W: std::io::Write>(&self, writer: &mut W) -> std::io::Result<()> {
5 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 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 let mut buffer: Vec<u8> = Vec::new();
60 chunk_disk_format.write(&mut buffer).unwrap();
61
62 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 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}