1pub mod indexed_reader;
4mod indexer;
5pub mod reader;
6pub mod writer;
7
8use std::io::{self, BufRead, Read, Seek, SeekFrom};
9
10use noodles_bgzf as bgzf;
11
12pub use self::{indexed_reader::IndexedReader, indexer::Indexer, reader::Reader, writer::Writer};
13
14pub enum BufReader<R> {
16 Bgzf(bgzf::io::IndexedReader<R>),
18 Uncompressed(std::io::BufReader<R>),
20}
21
22impl<R> Read for BufReader<R>
23where
24 R: Read,
25{
26 fn read(&mut self, buf: &mut [u8]) -> io::Result<usize> {
27 match self {
28 Self::Bgzf(reader) => reader.read(buf),
29 Self::Uncompressed(reader) => reader.read(buf),
30 }
31 }
32}
33
34impl<R> BufRead for BufReader<R>
35where
36 R: Read,
37{
38 fn fill_buf(&mut self) -> io::Result<&[u8]> {
39 match self {
40 Self::Bgzf(reader) => reader.fill_buf(),
41 Self::Uncompressed(reader) => reader.fill_buf(),
42 }
43 }
44
45 fn consume(&mut self, amt: usize) {
46 match self {
47 Self::Bgzf(reader) => reader.consume(amt),
48 Self::Uncompressed(reader) => reader.consume(amt),
49 }
50 }
51}
52
53impl<R> Seek for BufReader<R>
54where
55 R: Read + Seek,
56{
57 fn seek(&mut self, pos: SeekFrom) -> std::io::Result<u64> {
58 match self {
59 Self::Bgzf(reader) => reader.seek(pos),
60 Self::Uncompressed(reader) => reader.seek(pos),
61 }
62 }
63}