compression_codecs/zstd/
encoder.rs

1use crate::{
2    zstd::{params::CParameter, OperationExt},
3    EncodeV2,
4};
5use compression_core::{
6    unshared::Unshared,
7    util::{PartialBuffer, WriteBuffer},
8};
9use libzstd::stream::raw::Encoder;
10use std::io::{self, Result};
11
12#[derive(Debug)]
13pub struct ZstdEncoder {
14    encoder: Unshared<Encoder<'static>>,
15}
16
17impl ZstdEncoder {
18    pub fn new(level: i32) -> Self {
19        Self {
20            encoder: Unshared::new(Encoder::new(level).unwrap()),
21        }
22    }
23
24    pub fn new_with_params(level: i32, params: &[CParameter]) -> Self {
25        let mut encoder = Encoder::new(level).unwrap();
26        for param in params {
27            encoder.set_parameter(param.as_zstd()).unwrap();
28        }
29        Self {
30            encoder: Unshared::new(encoder),
31        }
32    }
33
34    pub fn new_with_dict(level: i32, dictionary: &[u8]) -> io::Result<Self> {
35        let encoder = Encoder::with_dictionary(level, dictionary)?;
36        Ok(Self {
37            encoder: Unshared::new(encoder),
38        })
39    }
40}
41
42impl EncodeV2 for ZstdEncoder {
43    fn encode(
44        &mut self,
45        input: &mut PartialBuffer<&[u8]>,
46        output: &mut WriteBuffer<'_>,
47    ) -> Result<()> {
48        self.encoder.run(input, output)?;
49        Ok(())
50    }
51
52    fn flush(&mut self, output: &mut WriteBuffer<'_>) -> Result<bool> {
53        self.encoder.flush(output)
54    }
55
56    fn finish(&mut self, output: &mut WriteBuffer<'_>) -> Result<bool> {
57        self.encoder.finish(output)
58    }
59}