1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
use ;
/// Trait bound enabling `TgzReader::independent_read_chapter`.
///
/// See the example code on [`independent_read_chapter`].
///
/// [`independent_read_chapter`]: crate::TgzReader::independent_read_chapter
///
/// # Example
///
/// A reader that increments an [Indicatif] progress bar as bytes are read.
///
/// [Indicatif]: https://crates.io/crates/indicatif
///
/// ```
/// use chapter_tgz::IndependentRead;
/// use indicatif::ProgressBar;
/// use std::io::{self, Read, Seek, SeekFrom};
///
/// pub struct ProgressRead<'a, R> {
/// inner: R,
/// progress: &'a ProgressBar,
/// }
///
/// impl<R: Read> Read for ProgressRead<'_, R> {
/// fn read(&mut self, buf: &mut [u8]) -> io::Result<usize> {
/// let n = self.inner.read(buf)?;
/// self.progress.inc(n as u64);
/// Ok(n)
/// }
/// }
///
/// impl<R: Seek> Seek for ProgressRead<'_, R> {
/// fn seek(&mut self, pos: SeekFrom) -> io::Result<u64> {
/// self.inner.seek(pos)
/// }
/// }
///
/// impl<R: IndependentRead> IndependentRead for ProgressRead<'_, R> {
/// fn independent_clone(&self) -> io::Result<Self> {
/// Ok(ProgressRead {
/// inner: self.inner.independent_clone()?,
/// progress: self.progress,
/// })
/// }
/// }
/// ```