1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
use anyhow::{Result, anyhow};
use std::io::BufRead;
use bstr::io::{BufReadExt, ByteLines};
use super::GtfRecord;
pub struct GtfReader <R: BufRead> {
inner: ByteLines<R>
}
impl <R: BufRead> GtfReader <R> {
pub fn from_bufread(reader: R) -> Self {
let inner = reader.byte_lines();
Self { inner }
}
}
impl <R: BufRead> Iterator for GtfReader <R> {
type Item = Result<GtfRecord>;
fn next(&mut self) -> Option<Self::Item> {
match self.inner.next() {
Some(line) => match line {
Ok(bytes) => match GtfRecord::from_bytes(&bytes) {
Ok(record) => Some(Ok(record)),
Err(e) => Some(Err(e))
},
Err(e) => Some(Err(anyhow!("{}", e)))
},
None => None
}
}
}