noodles_cram/async/io/reader/header/
container.rs

1//! Async CRAM header container reader.
2
3mod block;
4mod header;
5mod sam_header;
6
7use tokio::io::{self, AsyncRead, AsyncReadExt, Take};
8
9use self::block::read_block;
10pub use self::block::Decoder;
11pub(super) use self::header::read_header;
12
13/// An async CRAM header container reader.
14pub struct Reader<R> {
15    inner: Take<R>,
16}
17
18impl<R> Reader<R>
19where
20    R: AsyncRead + Unpin,
21{
22    pub(super) fn new(inner: R, len: u64) -> Self {
23        Self {
24            inner: inner.take(len),
25        }
26    }
27
28    /// Returns a raw SAM header reader.
29    pub async fn raw_sam_header_reader(
30        &mut self,
31    ) -> io::Result<sam_header::Reader<Decoder<&mut Take<R>>>> {
32        let mut reader = read_block(&mut self.inner).await?;
33
34        let len = reader.read_i32_le().await.and_then(|n| {
35            u64::try_from(n).map_err(|e| io::Error::new(io::ErrorKind::InvalidData, e))
36        })?;
37
38        Ok(sam_header::Reader::new(reader, len))
39    }
40
41    /// Discards all input until EOF.
42    pub async fn discard_to_end(&mut self) -> io::Result<u64> {
43        io::copy(&mut self.inner, &mut io::sink()).await
44    }
45}