noodles_fasta/
io.rs

1//! FASTA I/O.
2
3pub 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/// A buffered FASTA reader.
15pub enum BufReader<R> {
16    /// bgzip-compressed.
17    Bgzf(bgzf::io::IndexedReader<R>),
18    /// Uncompressed.
19    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}