Skip to main content

rw_builder/
zstd.rs

1use crate::{Result, RwBuilder};
2
3/// Type returned by the `zstd` function on the `RwBuilderExt` trait.
4/// It is itself an `RwBuilder` so can be chained further.
5#[derive(Debug)]
6#[must_use]
7pub struct ZstdBuilder<B>
8where
9    B: RwBuilder,
10{
11    /// Inner builder
12    builder: B,
13    /// Compression level for zstd
14    level: i32,
15}
16
17impl<B> ZstdBuilder<B>
18where
19    B: RwBuilder,
20{
21    /// Factory function to wrap an inner builder
22    pub const fn new(builder: B, level: i32) -> Self {
23        Self { builder, level }
24    }
25}
26
27impl<B> RwBuilder for ZstdBuilder<B>
28where
29    B: RwBuilder,
30{
31    type Reader = zstd::stream::read::Decoder<'static, std::io::BufReader<B::Reader>>;
32
33    fn reader(&self) -> Result<Self::Reader> {
34        let reader = self.builder.reader()?;
35        zstd::stream::read::Decoder::new(reader).map_err(Into::into)
36    }
37
38    type Writer = zstd::stream::write::Encoder<'static, B::Writer>;
39
40    fn writer(&self) -> Result<Self::Writer> {
41        let writer = self.builder.writer()?;
42        zstd::stream::write::Encoder::new(writer, self.level).map_err(Into::into)
43    }
44}