noodles_bcf/io/
indexed_reader.rs

1//! Indxed BCF reader.
2
3mod builder;
4
5pub use self::builder::Builder;
6
7use std::io::{self, Read};
8
9use noodles_bgzf as bgzf;
10use noodles_core::Region;
11use noodles_csi::BinningIndex;
12use noodles_vcf::{self as vcf, variant::RecordBuf};
13
14use super::{
15    reader::{Query, RecordBufs},
16    Reader,
17};
18use crate::Record;
19
20/// An indexed BCF reader.
21pub struct IndexedReader<R> {
22    inner: Reader<R>,
23    index: Box<dyn BinningIndex>,
24}
25
26impl<R> IndexedReader<R>
27where
28    R: Read,
29{
30    /// Returns a reference to the underlying reader.
31    pub fn get_ref(&self) -> &R {
32        self.inner.get_ref()
33    }
34
35    /// Returns a mutable reference to the underlying reader.
36    pub fn get_mut(&mut self) -> &mut R {
37        self.inner.get_mut()
38    }
39
40    /// Returns the underlying reader.
41    pub fn into_inner(self) -> R {
42        self.inner.into_inner()
43    }
44
45    /// Reads the VCF header.
46    pub fn read_header(&mut self) -> io::Result<vcf::Header> {
47        self.inner.read_header()
48    }
49
50    /// Reads a single record.
51    pub fn read_record_buf(
52        &mut self,
53        header: &vcf::Header,
54        record: &mut RecordBuf,
55    ) -> io::Result<usize> {
56        self.inner.read_record_buf(header, record)
57    }
58
59    /// Reads a single record without eagerly decoding (most of) its fields.
60    pub fn read_record(&mut self, record: &mut Record) -> io::Result<usize> {
61        self.inner.read_record(record)
62    }
63
64    /// Returns an iterator over records starting from the current stream position.
65    pub fn record_bufs<'r, 'h>(&'r mut self, header: &'h vcf::Header) -> RecordBufs<'r, 'h, R> {
66        self.inner.record_bufs(header)
67    }
68
69    /// Returns an iterator over lazy records starting from the current stream position.
70    pub fn records(&mut self) -> impl Iterator<Item = io::Result<Record>> + '_ {
71        self.inner.records()
72    }
73
74    /// Returns the associated index.
75    pub fn index(&self) -> &dyn BinningIndex {
76        &self.index
77    }
78}
79
80impl<R> IndexedReader<bgzf::Reader<R>>
81where
82    R: Read,
83{
84    /// Creates an indexed BCF reader.
85    pub fn new<I>(inner: R, index: I) -> Self
86    where
87        I: BinningIndex + 'static,
88    {
89        Self {
90            inner: Reader::new(inner),
91            index: Box::new(index),
92        }
93    }
94}
95
96impl<R> IndexedReader<R>
97where
98    R: bgzf::io::BufRead + bgzf::io::Seek,
99{
100    /// Returns an iterator over records that intersects the given region.
101    pub fn query<'r, 'h>(
102        &'r mut self,
103        header: &'h vcf::Header,
104        region: &Region,
105    ) -> io::Result<Query<'r, 'h, R>> {
106        self.inner.query(header, &self.index, region)
107    }
108}