noodles_cram/io/
indexed_reader.rs

1//! Indexed CRAM reader.
2
3mod builder;
4
5pub use self::builder::Builder;
6
7use std::io::{self, Read, Seek};
8
9use noodles_core::Region;
10use noodles_fasta as fasta;
11use noodles_sam as sam;
12
13use super::{
14    reader::{Container, Query, Records},
15    Reader,
16};
17use crate::{crai, FileDefinition};
18
19/// An indexed CRAM reader.
20pub struct IndexedReader<R> {
21    inner: Reader<R>,
22    index: crai::Index,
23}
24
25impl<R> IndexedReader<R>
26where
27    R: Read,
28{
29    /// Creates an indexed CRAM reader.
30    pub fn new(inner: R, index: crai::Index) -> Self {
31        Self {
32            inner: Reader::new(inner),
33            index,
34        }
35    }
36
37    /// Returns a reference to the underlying reader.
38    pub fn get_ref(&self) -> &R {
39        self.inner.get_ref()
40    }
41
42    /// Returns a mutable reference to the underlying reader.
43    pub fn get_mut(&mut self) -> &mut R {
44        self.inner.get_mut()
45    }
46
47    /// Unwraps and returns the underlying reader.
48    pub fn into_inner(self) -> R {
49        self.inner.into_inner()
50    }
51
52    /// Returns the reference sequence repository.
53    pub fn reference_sequence_repository(&self) -> &fasta::Repository {
54        self.inner.reference_sequence_repository()
55    }
56
57    /// Reads the CRAM file definition.
58    pub fn read_file_definition(&mut self) -> io::Result<FileDefinition> {
59        self.inner.read_file_definition()
60    }
61
62    /// Reads the SAM header.
63    pub fn read_file_header(&mut self) -> io::Result<sam::Header> {
64        self.inner.read_file_header()
65    }
66
67    /// Reads the SAM header.
68    pub fn read_header(&mut self) -> io::Result<sam::Header> {
69        self.inner.read_header()
70    }
71
72    /// Reads a container.
73    pub fn read_container(&mut self, container: &mut Container) -> io::Result<usize> {
74        self.inner.read_container(container)
75    }
76
77    /// Returns a iterator over records starting from the current stream position.
78    pub fn records<'r>(&'r mut self, header: &'r sam::Header) -> Records<'r, R> {
79        self.inner.records(header)
80    }
81
82    /// Returns the associated index.
83    pub fn index(&self) -> &crai::Index {
84        &self.index
85    }
86}
87
88impl<R> IndexedReader<R>
89where
90    R: Read + Seek,
91{
92    /// Returns an iterator over records that intersects the given region.
93    pub fn query<'a>(
94        &'a mut self,
95        header: &'a sam::Header,
96        region: &Region,
97    ) -> io::Result<Query<'a, R>> {
98        self.inner.query(header, &self.index, region)
99    }
100}