sigalign_utils/sequence_reader/fasta/
mod.rs

1use std::{io::{Read, Error}, fs::File, path::Path, str::Utf8Error};
2
3use seq_io::fasta::{
4    Reader as SeqIoReader,
5    RefRecord as SeqIoRecord, Record,
6};
7
8use super::{
9    SeqRecord,
10    IdRecord,
11    IdRefRecord,
12};
13
14/// The reader of FASTA formatted file
15pub struct FastaReader<R: Read> {
16    reader: SeqIoReader<R>,
17}
18
19pub struct FastaRecord<'a> {
20    record: SeqIoRecord<'a>,
21}
22
23impl<'a, R: Read> FastaReader<R> {
24    pub fn new(reader: R) -> Self {
25        let reader = SeqIoReader::new(reader);
26        Self {
27            reader
28        }
29    }
30    pub fn next(&'a mut self) -> Option<FastaRecord<'a>> {
31        if let Some(Ok(seq)) = self.reader.next() {
32            Some(FastaRecord {
33                record: seq,
34            })
35        } else {
36            None
37        }
38    }
39}
40impl FastaReader<File> {
41    pub fn from_path<P: AsRef<Path>>(path: P) -> Result<Self, Error> {
42        let reader = SeqIoReader::from_path(path)?;
43        Ok(Self {
44            reader
45        })
46    }
47}
48
49impl<'a> SeqRecord for FastaRecord<'a> {
50    fn extend_seq_buf(&mut self, buf: &mut Vec<u8>) {
51        self.record.seq_lines().for_each(|s| buf.extend_from_slice(s));
52    }
53}
54
55impl<'a> IdRecord for FastaRecord<'a> {
56    fn extend_id_buf(&mut self, buf: &mut Vec<u8>) {
57        buf.extend(self.record.id_bytes());
58    }
59    fn extend_id_string(&mut self, buf: &mut String) -> Result<(), Utf8Error> {
60        buf.push_str(self.record.id()?);
61        Ok(())
62    }
63}
64
65impl<'a> IdRefRecord for FastaRecord<'a> {
66    fn id(&self) -> &[u8] {
67        self.record.id_bytes()
68    }
69    fn id_str(&self) -> Result<&str, Utf8Error> {
70        self.record.id()
71    }
72}