noodles_cram/async/io/reader/header/
container.rsmod block;
mod header;
mod sam_header;
use tokio::io::{self, AsyncRead, AsyncReadExt, Take};
use self::block::read_block;
pub(super) use self::header::read_header;
pub struct Reader<R> {
inner: Take<R>,
}
impl<R> Reader<R>
where
R: AsyncRead + Unpin,
{
pub(super) fn new(inner: R, len: u64) -> Self {
Self {
inner: inner.take(len),
}
}
pub async fn raw_sam_header_reader(
&mut self,
) -> io::Result<sam_header::Reader<impl AsyncRead + Unpin + '_>> {
let mut reader = read_block(&mut self.inner).await?;
let len = reader.read_i32_le().await.and_then(|n| {
u64::try_from(n).map_err(|e| io::Error::new(io::ErrorKind::InvalidData, e))
})?;
Ok(sam_header::Reader::new(reader, len))
}
pub async fn discard_to_end(&mut self) -> io::Result<u64> {
io::copy(&mut self.inner, &mut io::sink()).await
}
}