sigalign_utils/sequence_reader/fastq/
mod.rs1use 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
20pub 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}