noodles_tabix/io/reader.rs
1mod index;
2
3use std::io::{self, Read};
4
5use noodles_bgzf as bgzf;
6
7use self::index::read_index;
8use crate::Index;
9
10/// A tabix reader.
11///
12/// Consider using [`crate::read`] to read the entire index at once.
13pub struct Reader<R> {
14 inner: bgzf::Reader<R>,
15}
16
17impl<R> Reader<R> {
18 /// Returns a reference to the underlying reader.
19 ///
20 /// # Examples
21 ///
22 /// ```
23 /// # use std::io;
24 /// use noodles_tabix as tabix;
25 /// let reader = tabix::io::Reader::new(io::empty());
26 /// let _inner = reader.get_ref();
27 /// ```
28 pub fn get_ref(&self) -> &bgzf::Reader<R> {
29 &self.inner
30 }
31
32 /// Returns a mutable reference to the underlying reader.
33 ///
34 /// # Examples
35 ///
36 /// ```
37 /// # use std::io;
38 /// use noodles_tabix as tabix;
39 /// let mut reader = tabix::io::Reader::new(io::empty());
40 /// let _inner = reader.get_mut();
41 /// ```
42 pub fn get_mut(&mut self) -> &mut bgzf::Reader<R> {
43 &mut self.inner
44 }
45
46 /// Returns the underlying reader.
47 ///
48 /// # Examples
49 ///
50 /// ```
51 /// # use std::io;
52 /// use noodles_tabix as tabix;
53 /// let reader = tabix::io::Reader::new(io::empty());
54 /// let _inner = reader.into_inner();
55 /// ```
56 pub fn into_inner(self) -> bgzf::Reader<R> {
57 self.inner
58 }
59}
60
61impl<R> Reader<R>
62where
63 R: Read,
64{
65 /// Creates a tabix reader.
66 ///
67 /// # Examples
68 ///
69 /// ```no_run
70 /// # use std::{fs::File, io};
71 /// use noodles_tabix as tabix;;
72 /// let reader = File::open("sample.vcf.gz.tbi").map(tabix::io::Reader::new)?;
73 /// # Ok::<(), io::Error>(())
74 /// ```
75 pub fn new(reader: R) -> Self {
76 Self {
77 inner: bgzf::Reader::new(reader),
78 }
79 }
80
81 /// Reads the tabix index.
82 ///
83 /// The position of the stream is expected to be at the beginning.
84 ///
85 /// # Examples
86 ///
87 /// ```no_run
88 /// # use std::{fs::File, io};
89 /// use noodles_tabix as tabix;;
90 /// let mut reader = File::open("sample.vcf.gz.tbi").map(tabix::io::Reader::new)?;
91 /// let index = reader.read_index()?;
92 /// # Ok::<(), io::Error>(())
93 /// ```
94 pub fn read_index(&mut self) -> io::Result<Index> {
95 read_index(&mut self.inner)
96 }
97}