use std::fs::File;
use std::io::{BufWriter, Write};
use std::path::Path;
use crate::bed::BedLine;
use crate::models::{Transcript, TranscriptWrite};
use crate::utils::errors::ParseBedError;
use crate::utils::errors::ReadWriteError;
pub struct Writer<W: std::io::Write> {
inner: BufWriter<W>,
}
impl Writer<File> {
pub fn from_file<P: AsRef<Path>>(path: P) -> Result<Self, ReadWriteError> {
match File::create(path.as_ref()) {
Ok(file) => Ok(Self::new(file)),
Err(err) => Err(ReadWriteError::new(err)),
}
}
}
impl<W: std::io::Write> Writer<W> {
pub fn new(writer: W) -> Self {
Writer {
inner: BufWriter::new(writer),
}
}
pub fn with_capacity(capacity: usize, writer: W) -> Self {
Writer {
inner: BufWriter::with_capacity(capacity, writer),
}
}
pub fn flush(&mut self) -> Result<(), ParseBedError> {
match self.inner.flush() {
Ok(res) => Ok(res),
Err(err) => Err(ParseBedError::from(err.to_string())),
}
}
pub fn into_inner(self) -> Result<W, ParseBedError> {
match self.inner.into_inner() {
Ok(res) => Ok(res),
Err(err) => Err(ParseBedError::from(err.to_string())),
}
}
}
impl<W: std::io::Write> TranscriptWrite for Writer<W> {
fn writeln_single_transcript(&mut self, transcript: &Transcript) -> Result<(), std::io::Error> {
self.write_single_transcript(transcript)?;
self.inner.write_all("\n".as_bytes())
}
fn write_single_transcript(&mut self, transcript: &Transcript) -> Result<(), std::io::Error> {
self.inner
.write_all(BedLine::from(transcript).to_string().as_bytes())
}
}