Documentation
use std::{fs::File, io::BufReader};

use bio::io::fasta::{self, FastaRead};

use super::ReadInfo;

pub struct FastaFileReader {
    fname: String,
    reader: fasta::Reader<BufReader<File>>,
    record: fasta::Record,
}

impl FastaFileReader {
    pub fn new(fname: String) -> Self {
        let file = File::open(&fname).expect(&format!("open file error: {}", fname));
        let reader = BufReader::new(file);
        let reader = fasta::Reader::from_bufread(reader);

        Self {
            fname: fname,
            reader: reader,
            record: fasta::Record::new(),
        }
    }
    pub fn get_fname(&self) -> &str {
        return &self.fname;
    }
}

impl Iterator for FastaFileReader {
    type Item = ReadInfo;
    fn next(&mut self) -> Option<Self::Item> {
        self.reader
            .read(&mut self.record)
            .expect(&format!("read fasta error {}", self.fname));

        return if self.record.is_empty() {
            None
        } else {
            Some(ReadInfo::new_fa_record(
                self.record.id().to_string(),
                unsafe { String::from_utf8_unchecked(self.record.seq().to_vec()) },
            ))
        };
    }
}