hdrhistogram/serialization/
v2_deflate_serializer.rs1use super::v2_serializer::{V2SerializeError, V2Serializer};
2use super::{Serializer, V2_COMPRESSED_COOKIE};
3use crate::core::counter::Counter;
4use crate::Histogram;
5use byteorder::{BigEndian, WriteBytesExt};
6use flate2::write::ZlibEncoder;
7use flate2::Compression;
8use std::io::{self, Write};
9use std::{self, error, fmt};
10
11#[derive(Debug)]
13pub enum V2DeflateSerializeError {
14 InternalSerializationError(V2SerializeError),
16 IoError(io::Error),
18}
19
20impl std::convert::From<std::io::Error> for V2DeflateSerializeError {
21 fn from(e: std::io::Error) -> Self {
22 V2DeflateSerializeError::IoError(e)
23 }
24}
25
26impl fmt::Display for V2DeflateSerializeError {
27 fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
28 match self {
29 V2DeflateSerializeError::InternalSerializationError(e) => {
30 write!(f, "The underlying serialization failed: {}", e)
31 }
32 V2DeflateSerializeError::IoError(e) => {
33 write!(f, "The underlying serialization failed: {}", e)
34 }
35 }
36 }
37}
38
39impl error::Error for V2DeflateSerializeError {
40 fn source(&self) -> Option<&(dyn error::Error + 'static)> {
41 match self {
42 V2DeflateSerializeError::InternalSerializationError(e) => Some(e),
43 V2DeflateSerializeError::IoError(e) => Some(e),
44 }
45 }
46}
47
48pub struct V2DeflateSerializer {
53 uncompressed_buf: Vec<u8>,
54 compressed_buf: Vec<u8>,
55 v2_serializer: V2Serializer,
56}
57
58impl Default for V2DeflateSerializer {
59 fn default() -> Self {
60 Self::new()
61 }
62}
63
64impl V2DeflateSerializer {
65 pub fn new() -> V2DeflateSerializer {
67 V2DeflateSerializer {
68 uncompressed_buf: Vec::new(),
69 compressed_buf: Vec::new(),
70 v2_serializer: V2Serializer::new(),
71 }
72 }
73}
74
75impl Serializer for V2DeflateSerializer {
76 type SerializeError = V2DeflateSerializeError;
77
78 fn serialize<T: Counter, W: Write>(
79 &mut self,
80 h: &Histogram<T>,
81 writer: &mut W,
82 ) -> Result<usize, V2DeflateSerializeError> {
83 self.uncompressed_buf.clear();
90 self.compressed_buf.clear();
91 let uncompressed_len = self
93 .v2_serializer
94 .serialize(h, &mut self.uncompressed_buf)
95 .map_err(V2DeflateSerializeError::InternalSerializationError)?;
96
97 debug_assert_eq!(self.uncompressed_buf.len(), uncompressed_len);
98 self.compressed_buf.reserve(self.uncompressed_buf.len() / 2);
103
104 self.compressed_buf
105 .write_u32::<BigEndian>(V2_COMPRESSED_COOKIE)?;
106 self.compressed_buf.write_u32::<BigEndian>(0)?;
108
109 {
116 let mut compressor = ZlibEncoder::new(&mut self.compressed_buf, Compression::default());
118 compressor.write_all(&self.uncompressed_buf[0..uncompressed_len])?;
119 let _ = compressor.finish()?;
120 }
121
122 let total_compressed_len = self.compressed_buf.len();
126 (&mut self.compressed_buf[4..8])
127 .write_u32::<BigEndian>((total_compressed_len as u32) - 8)?;
128
129 writer.write_all(&self.compressed_buf)?;
130
131 Ok(total_compressed_len)
132 }
133}