msg_tool\scripts\kirikiri\archive\xp3/
reader.rs

1use adler::Adler32;
2use std::io::{PipeReader, Read};
3
4pub struct Reader {
5    inner: PipeReader,
6    adler: Adler32,
7    readed: u64,
8}
9
10impl Reader {
11    pub fn new(inner: PipeReader) -> Self {
12        Self {
13            inner,
14            adler: Adler32::new(),
15            readed: 0,
16        }
17    }
18
19    pub fn into_checksum(self) -> u32 {
20        self.adler.checksum()
21    }
22
23    pub fn total_readed(&self) -> u64 {
24        self.readed
25    }
26}
27
28impl Read for Reader {
29    fn read(&mut self, buf: &mut [u8]) -> std::io::Result<usize> {
30        let n = self.inner.read(buf)?;
31        self.adler.write_slice(&buf[..n]);
32        self.readed += n as u64;
33        Ok(n)
34    }
35}