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}