1use std::io::{self, BufRead, BufReader, Read};
3
4use crate::dict::{DecoderDictionary, EncoderDictionary};
5use crate::stream::{raw, zio};
6use zstd_safe;
7
8#[cfg(test)]
9mod tests;
10
11pub struct Decoder<'a, R> {
16 reader: zio::Reader<R, raw::Decoder<'a>>,
17}
18
19pub struct Encoder<'a, R> {
21 reader: zio::Reader<R, raw::Encoder<'a>>,
22}
23
24impl<R: Read> Decoder<'static, BufReader<R>> {
25 pub fn new(reader: R) -> io::Result<Self> {
27 let buffer_size = zstd_safe::DCtx::in_size();
28
29 Self::with_buffer(BufReader::with_capacity(buffer_size, reader))
30 }
31}
32
33impl<R: BufRead> Decoder<'static, R> {
34 pub fn with_buffer(reader: R) -> io::Result<Self> {
36 Self::with_dictionary(reader, &[])
37 }
38 pub fn with_dictionary(reader: R, dictionary: &[u8]) -> io::Result<Self> {
42 let decoder = raw::Decoder::with_dictionary(dictionary)?;
43 let reader = zio::Reader::new(reader, decoder);
44
45 Ok(Decoder { reader })
46 }
47}
48impl<'a, R: BufRead> Decoder<'a, R> {
49 pub fn with_context(
51 reader: R,
52 context: &'a mut zstd_safe::DCtx<'static>,
53 ) -> Self {
54 Self {
55 reader: zio::Reader::new(
56 reader,
57 raw::Decoder::with_context(context),
58 ),
59 }
60 }
61
62 #[must_use]
66 pub fn single_frame(mut self) -> Self {
67 self.reader.set_single_frame();
68 self
69 }
70
71 pub fn with_prepared_dictionary<'b>(
75 reader: R,
76 dictionary: &DecoderDictionary<'b>,
77 ) -> io::Result<Self>
78 where
79 'b: 'a,
80 {
81 let decoder = raw::Decoder::with_prepared_dictionary(dictionary)?;
82 let reader = zio::Reader::new(reader, decoder);
83
84 Ok(Decoder { reader })
85 }
86
87 pub fn with_ref_prefix<'b>(
91 reader: R,
92 ref_prefix: &'b [u8],
93 ) -> io::Result<Self>
94 where
95 'b: 'a,
96 {
97 let decoder = raw::Decoder::with_ref_prefix(ref_prefix)?;
98 let reader = zio::Reader::new(reader, decoder);
99
100 Ok(Decoder { reader })
101 }
102
103 pub fn recommended_output_size() -> usize {
105 zstd_safe::DCtx::out_size()
106 }
107
108 pub fn get_ref(&self) -> &R {
110 self.reader.reader()
111 }
112
113 pub fn get_mut(&mut self) -> &mut R {
118 self.reader.reader_mut()
119 }
120
121 pub fn finish(self) -> R {
126 self.reader.into_inner()
127 }
128
129 crate::decoder_common!(reader);
130}
131
132impl<R: BufRead> Read for Decoder<'_, R> {
133 fn read(&mut self, buf: &mut [u8]) -> io::Result<usize> {
134 self.reader.read(buf)
135 }
136}
137
138impl<R: Read> Encoder<'static, BufReader<R>> {
139 pub fn new(reader: R, level: i32) -> io::Result<Self> {
141 let buffer_size = zstd_safe::CCtx::in_size();
142
143 Self::with_buffer(BufReader::with_capacity(buffer_size, reader), level)
144 }
145}
146
147impl<R: BufRead> Encoder<'static, R> {
148 pub fn with_buffer(reader: R, level: i32) -> io::Result<Self> {
150 Self::with_dictionary(reader, level, &[])
151 }
152
153 pub fn with_dictionary(
157 reader: R,
158 level: i32,
159 dictionary: &[u8],
160 ) -> io::Result<Self> {
161 let encoder = raw::Encoder::with_dictionary(level, dictionary)?;
162 let reader = zio::Reader::new(reader, encoder);
163
164 Ok(Encoder { reader })
165 }
166}
167
168impl<'a, R: BufRead> Encoder<'a, R> {
169 pub fn with_context(
171 reader: R,
172 context: &'a mut zstd_safe::CCtx<'static>,
173 ) -> Self {
174 Self {
175 reader: zio::Reader::new(
176 reader,
177 raw::Encoder::with_context(context),
178 ),
179 }
180 }
181
182 pub fn with_prepared_dictionary<'b>(
186 reader: R,
187 dictionary: &EncoderDictionary<'b>,
188 ) -> io::Result<Self>
189 where
190 'b: 'a,
191 {
192 let encoder = raw::Encoder::with_prepared_dictionary(dictionary)?;
193 let reader = zio::Reader::new(reader, encoder);
194
195 Ok(Encoder { reader })
196 }
197
198 pub fn recommended_output_size() -> usize {
200 zstd_safe::CCtx::out_size()
201 }
202
203 pub fn get_ref(&self) -> &R {
205 self.reader.reader()
206 }
207
208 pub fn get_mut(&mut self) -> &mut R {
213 self.reader.reader_mut()
214 }
215
216 pub fn flush(&mut self, out: &mut [u8]) -> io::Result<usize> {
226 self.reader.flush(out)
227 }
228
229 pub fn finish(self) -> R {
234 self.reader.into_inner()
235 }
236
237 crate::encoder_common!(reader);
238}
239
240impl<R: BufRead> Read for Encoder<'_, R> {
241 fn read(&mut self, buf: &mut [u8]) -> io::Result<usize> {
242 self.reader.read(buf)
243 }
244}
245
246fn _assert_traits() {
247 use std::io::Cursor;
248
249 fn _assert_send<T: Send>(_: T) {}
250
251 _assert_send(Decoder::new(Cursor::new(Vec::new())));
252 _assert_send(Encoder::new(Cursor::new(Vec::new()), 1));
253}