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
14#[deprecated(since = "0.48.0", note = "Use `fasta::fs::index` instead.")]
15pub use super::fs::index;
16
17pub enum BufReader<R> {
19 Bgzf(bgzf::IndexedReader<R>),
21 Uncompressed(std::io::BufReader<R>),
23}
24
25impl<R> Read for BufReader<R>
26where
27 R: Read,
28{
29 fn read(&mut self, buf: &mut [u8]) -> io::Result<usize> {
30 match self {
31 Self::Bgzf(reader) => reader.read(buf),
32 Self::Uncompressed(reader) => reader.read(buf),
33 }
34 }
35}
36
37impl<R> BufRead for BufReader<R>
38where
39 R: Read,
40{
41 fn fill_buf(&mut self) -> io::Result<&[u8]> {
42 match self {
43 Self::Bgzf(reader) => reader.fill_buf(),
44 Self::Uncompressed(reader) => reader.fill_buf(),
45 }
46 }
47
48 fn consume(&mut self, amt: usize) {
49 match self {
50 Self::Bgzf(reader) => reader.consume(amt),
51 Self::Uncompressed(reader) => reader.consume(amt),
52 }
53 }
54}
55
56impl<R> Seek for BufReader<R>
57where
58 R: Read + Seek,
59{
60 fn seek(&mut self, pos: SeekFrom) -> std::io::Result<u64> {
61 match self {
62 Self::Bgzf(reader) => reader.seek(pos),
63 Self::Uncompressed(reader) => reader.seek(pos),
64 }
65 }
66}