sevenz_rust2/writer/
source_reader.rs1use 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}