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#[deprecated(since = "0.48.0", note = "Use `fasta::fs::index` instead.")]
15pub use super::fs::index;
16
17/// A buffered FASTA reader.
18pub enum BufReader<R> {
19    /// bgzip-compressed.
20    Bgzf(bgzf::IndexedReader<R>),
21    /// Uncompressed.
22    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}