sevenz_rust2/writer/
source_reader.rs

1use std::io::Read;
2
3use crc32fast::Hasher;
4
5pub struct SourceReader<R> {
6    reader: R,
7    size: usize,
8    crc: Hasher,
9    crc_value: u32,
10}
11
12impl<R> From<R> for SourceReader<R> {
13    fn from(value: R) -> Self {
14        Self::new(value)
15    }
16}
17
18impl<R: Read> Read for SourceReader<R> {
19    fn read(&mut self, buf: &mut [u8]) -> std::io::Result<usize> {
20        let n = self.reader.read(buf)?;
21        if self.crc_value == 0 {
22            if n > 0 {
23                self.size += n;
24                self.crc.update(&buf[..n]);
25            } else {
26                let crc = std::mem::replace(&mut self.crc, Hasher::new());
27                self.crc_value = crc.finalize();
28            }
29        }
30        Ok(n)
31    }
32}
33
34impl<R> SourceReader<R> {
35    pub fn new(reader: R) -> Self {
36        Self {
37            reader,
38            size: 0,
39            crc: Hasher::new(),
40            crc_value: 0,
41        }
42    }
43
44    pub fn read_count(&self) -> usize {
45        self.size
46    }
47
48    pub fn crc_value(&self) -> u32 {
49        self.crc_value
50    }
51}