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    /// Reads a container.
78    #[deprecated(
79        since = "0.78.0",
80        note = "Use `IndexedReader::read_container` instead."
81    )]
82    pub fn read_data_container(&mut self) -> io::Result<Option<Container>> {
83        #[allow(deprecated)]
84        self.inner.read_data_container()
85    }
86
87    /// Returns a iterator over records starting from the current stream position.
88    pub fn records<'r>(&'r mut self, header: &'r sam::Header) -> Records<'r, R> {
89        self.inner.records(header)
90    }
91
92    /// Returns the associated index.
93    pub fn index(&self) -> &crai::Index {
94        &self.index
95    }
96}
97
98impl<R> IndexedReader<R>
99where
100    R: Read + Seek,
101{
102    /// Returns an iterator over records that intersects the given region.
103    pub fn query<'a>(
104        &'a mut self,
105        header: &'a sam::Header,
106        region: &Region,
107    ) -> io::Result<Query<'a, R>> {
108        self.inner.query(header, &self.index, region)
109    }
110}