noodles_bcf/io/
indexed_reader.rs1mod 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
20pub struct IndexedReader<R> {
22 inner: Reader<R>,
23 index: Box<dyn BinningIndex>,
24}
25
26impl<R> IndexedReader<R>
27where
28 R: Read,
29{
30 pub fn get_ref(&self) -> &R {
32 self.inner.get_ref()
33 }
34
35 pub fn get_mut(&mut self) -> &mut R {
37 self.inner.get_mut()
38 }
39
40 pub fn into_inner(self) -> R {
42 self.inner.into_inner()
43 }
44
45 pub fn read_header(&mut self) -> io::Result<vcf::Header> {
47 self.inner.read_header()
48 }
49
50 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 pub fn read_record(&mut self, record: &mut Record) -> io::Result<usize> {
61 self.inner.read_record(record)
62 }
63
64 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 pub fn records(&mut self) -> impl Iterator<Item = io::Result<Record>> + '_ {
71 self.inner.records()
72 }
73
74 pub fn index(&self) -> &dyn BinningIndex {
76 &self.index
77 }
78}
79
80impl<R> IndexedReader<bgzf::Reader<R>>
81where
82 R: Read,
83{
84 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 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}