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
        }
    }
}