compression_codecs/zstd/
encoder.rs1use 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}