use std::convert::AsRef;
use std::fs::File;
use std::io::{BufRead, BufReader, BufWriter, Cursor, Write};
use std::path::Path;
use util::ResultType;
pub trait Fastq: Sized {
#[inline(always)]
fn estimate_fastq_size(&self) -> usize {
0
}
fn to_fastq<T: Write>(&self, writer: &mut T) -> ResultType<()>;
fn to_fastq_string(&self) -> ResultType<String> {
let capacity = self.estimate_fastq_size();
let mut writer = Cursor::new(Vec::with_capacity(capacity));
self.to_fastq(&mut writer)?;
match String::from_utf8(writer.into_inner()) {
Err(e) => Err(Box::new(e)),
Ok(v) => Ok(v),
}
}
#[inline]
fn to_fastq_file<P: AsRef<Path>>(&self, path: P) -> ResultType<()> {
let file = File::create(path)?;
let mut writer = BufWriter::new(file);
self.to_fastq(&mut writer)
}
fn from_fastq<T: BufRead>(reader: &mut T) -> ResultType<Self>;
#[inline]
fn from_fastq_string(text: &str) -> ResultType<Self> {
let mut reader = Cursor::new(text);
Self::from_fastq(&mut reader)
}
#[inline]
fn from_fastq_file<P: AsRef<Path>>(path: P) -> ResultType<Self> {
let file = File::open(path)?;
let mut reader = BufReader::new(file);
Self::from_fastq(&mut reader)
}
}
pub trait FastqCollection: Fastq {
fn to_fastq_strict<T: Write>(&self, writer: &mut T) -> ResultType<()>;
fn to_fastq_lenient<T: Write>(&self, writer: &mut T) -> ResultType<()>;
fn from_fastq_strict<T: BufRead>(reader: &mut T) -> ResultType<Self>;
fn from_fastq_lenient<T: BufRead>(reader: &mut T) -> ResultType<Self>;
}