mod limit_reader; use std::io::Cursor; pub use limit_reader::LimitReader; mod etag_reader; pub use etag_reader::EtagReader; mod compress_reader; pub use compress_reader::{CompressReader, DecompressReader}; mod encrypt_reader; pub use encrypt_reader::{DecryptReader, EncryptReader}; mod hardlimit_reader; pub use hardlimit_reader::HardLimitReader; mod hash_reader; pub use hash_reader::*; pub mod compress; pub mod reader; pub use reader::WarpReader; mod writer; use tokio::io::{AsyncRead, BufReader}; pub use writer::*; mod http_reader; pub use http_reader::*; mod etag; pub trait Reader: tokio::io::AsyncRead + Unpin + Send + Sync + EtagResolvable + HashReaderDetector {} // Trait for types that can be recursively searched for etag capability pub trait EtagResolvable { fn is_etag_reader(&self) -> bool { false } fn try_resolve_etag(&mut self) -> Option { None } } // Generic function that can work with any EtagResolvable type pub fn resolve_etag_generic(reader: &mut R) -> Option where R: EtagResolvable, { reader.try_resolve_etag() } impl EtagResolvable for BufReader where T: AsyncRead + Unpin + Send + Sync {} impl EtagResolvable for Cursor where T: AsRef<[u8]> + Unpin + Send + Sync {} impl EtagResolvable for Box where T: EtagResolvable {} /// Trait to detect and manipulate HashReader instances pub trait HashReaderDetector { fn is_hash_reader(&self) -> bool { false } fn as_hash_reader_mut(&mut self) -> Option<&mut dyn HashReaderMut> { None } } impl HashReaderDetector for tokio::io::BufReader where T: AsyncRead + Unpin + Send + Sync {} impl HashReaderDetector for std::io::Cursor where T: AsRef<[u8]> + Unpin + Send + Sync {} impl HashReaderDetector for Box {} impl HashReaderDetector for Box where T: HashReaderDetector {} // Blanket implementations for Reader trait impl Reader for tokio::io::BufReader where T: AsyncRead + Unpin + Send + Sync {} impl Reader for std::io::Cursor where T: AsRef<[u8]> + Unpin + Send + Sync {} impl Reader for Box where T: Reader {} // Forward declarations for wrapper types that implement all required traits impl Reader for crate::HashReader {} impl Reader for HttpReader {} impl Reader for crate::HardLimitReader {} impl Reader for crate::EtagReader {} impl Reader for crate::EncryptReader where R: Reader {} impl Reader for crate::DecryptReader where R: Reader {} impl Reader for crate::CompressReader where R: Reader {} impl Reader for crate::DecompressReader where R: Reader {} impl Reader for tokio::fs::File {} impl HashReaderDetector for tokio::fs::File {} impl EtagResolvable for tokio::fs::File {} impl Reader for tokio::io::DuplexStream {} impl HashReaderDetector for tokio::io::DuplexStream {} impl EtagResolvable for tokio::io::DuplexStream {}