noodles_cram/io/reader/header/
container.rs

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
//! CRAM header container reader.

mod block;
mod header;
pub mod sam_header;

use std::io::{self, Read, Take};

use byteorder::{LittleEndian, ReadBytesExt};

use self::block::read_block;
pub(super) use self::header::read_header;

/// A CRAM header container reader.
pub struct Reader<R> {
    inner: Take<R>,
}

impl<R> Reader<R>
where
    R: Read,
{
    pub(super) fn new(inner: R, len: u64) -> Self {
        Self {
            inner: inner.take(len),
        }
    }

    /// Returns a raw SAM header reader.
    ///
    /// The caller is responsible of discarding any extra padding in the header text, e.g., using
    /// [`sam_header::Reader::discard_to_end`].
    pub fn raw_sam_header_reader(&mut self) -> io::Result<sam_header::Reader<impl Read + '_>> {
        let mut reader = read_block(&mut self.inner)?;

        let len = reader.read_i32::<LittleEndian>().and_then(|n| {
            u64::try_from(n).map_err(|e| io::Error::new(io::ErrorKind::InvalidData, e))
        })?;

        Ok(sam_header::Reader::new(reader, len))
    }

    /// Discards all input until EOF.
    pub fn discard_to_end(&mut self) -> io::Result<u64> {
        io::copy(&mut self.inner, &mut io::sink())
    }
}