sigalign_utils/sequence_reader/fastq/
mod.rs

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