Skip to main content

rw_builder/
crc32fast.rs

1use crate::{Result, RwBuilder};
2use std::io::{Read, Write};
3
4/// A builder that computes a CRC32 checksum using `crc32fast`
5#[derive(Debug)]
6#[must_use]
7pub struct Crc32FastBuilder<B>
8where
9    B: RwBuilder,
10{
11    /// Inner builder
12    builder: B,
13}
14
15impl<B> Crc32FastBuilder<B>
16where
17    B: RwBuilder,
18{
19    /// Factory function to wrap an inner builder
20    pub const fn new(builder: B) -> Self {
21        Self { builder }
22    }
23}
24
25impl<B> RwBuilder for Crc32FastBuilder<B>
26where
27    B: RwBuilder,
28    B::Reader: Read,
29    B::Writer: Write,
30{
31    type Reader = Crc32FastReader<B::Reader>;
32    type Writer = Crc32FastWriter<B::Writer>;
33
34    fn reader(&self) -> Result<Self::Reader> {
35        Ok(Crc32FastReader::new(self.builder.reader()?))
36    }
37
38    fn writer(&self) -> Result<Self::Writer> {
39        Ok(Crc32FastWriter::new(self.builder.writer()?))
40    }
41}
42
43/// A reader wrapper that computes a CRC32 checksum
44#[derive(Debug)]
45pub struct Crc32FastReader<R: Read> {
46    /// Inner reader
47    inner: R,
48    /// Hasher instance
49    hasher: crc32fast::Hasher,
50}
51
52impl<R: Read> Crc32FastReader<R> {
53    /// Creates a new `Crc32FastReader`
54    pub fn new(inner: R) -> Self {
55        Self { inner, hasher: crc32fast::Hasher::new() }
56    }
57
58    /// Consumes the reader and returns the computed CRC32 checksum.
59    pub fn finalize(self) -> u32 {
60        self.hasher.finalize()
61    }
62}
63
64impl<R: Read> Read for Crc32FastReader<R> {
65    fn read(&mut self, buf: &mut [u8]) -> std::io::Result<usize> {
66        let n = self.inner.read(buf)?;
67        self.hasher.update(&buf[..n]);
68        Ok(n)
69    }
70}
71
72/// A writer wrapper that computes a CRC32 checksum
73#[derive(Debug)]
74pub struct Crc32FastWriter<W: Write> {
75    /// Inner writer
76    inner: W,
77    /// Hasher instance
78    hasher: crc32fast::Hasher,
79}
80
81impl<W: Write> Crc32FastWriter<W> {
82    /// Creates a new `Crc32FastWriter`
83    pub fn new(inner: W) -> Self {
84        Self { inner, hasher: crc32fast::Hasher::new() }
85    }
86
87    /// Consumes the writer and returns the computed CRC32 checksum.
88    pub fn finalize(self) -> u32 {
89        self.hasher.finalize()
90    }
91}
92
93impl<W: Write> Write for Crc32FastWriter<W> {
94    fn write(&mut self, buf: &[u8]) -> std::io::Result<usize> {
95        let n = self.inner.write(buf)?;
96        self.hasher.update(&buf[..n]);
97        Ok(n)
98    }
99
100    fn flush(&mut self) -> std::io::Result<()> {
101        self.inner.flush()
102    }
103}