noodles_cram/io/reader/header/
container.rs

1//! CRAM header container reader.
2
3mod block;
4mod header;
5pub mod sam_header;
6
7use std::io::{self, Read, Take};
8
9use byteorder::{LittleEndian, ReadBytesExt};
10
11use self::block::read_block;
12pub(super) use self::header::read_header;
13
14/// A CRAM header container reader.
15pub struct Reader<R> {
16    inner: Take<R>,
17}
18
19impl<R> Reader<R>
20where
21    R: Read,
22{
23    pub(super) fn new(inner: R, len: u64) -> Self {
24        Self {
25            inner: inner.take(len),
26        }
27    }
28
29    /// Returns a raw SAM header reader.
30    ///
31    /// The caller is responsible of discarding any extra padding in the header text, e.g., using
32    /// [`sam_header::Reader::discard_to_end`].
33    pub fn raw_sam_header_reader(&mut self) -> io::Result<sam_header::Reader<impl Read + '_>> {
34        let mut reader = read_block(&mut self.inner)?;
35
36        let len = reader.read_i32::<LittleEndian>().and_then(|n| {
37            u64::try_from(n).map_err(|e| io::Error::new(io::ErrorKind::InvalidData, e))
38        })?;
39
40        Ok(sam_header::Reader::new(reader, len))
41    }
42
43    /// Discards all input until EOF.
44    pub fn discard_to_end(&mut self) -> io::Result<u64> {
45        io::copy(&mut self.inner, &mut io::sink())
46    }
47}