use std::{
fmt::Display,
fs::File,
io::{self, LineWriter, Seek, SeekFrom, Write},
path::Path,
};
use crate::file::FileWriter;
pub struct TextWriter {
file: LineWriter<File>,
count: u64,
}
impl FileWriter for TextWriter {
fn from_path<P>(path: P) -> io::Result<Self>
where
Self: Sized,
P: AsRef<Path>,
{
TextWriter::from_file(File::create(path)?)
}
fn from_file(file: File) -> io::Result<Self>
where
Self: Sized,
{
let writer = TextWriter {
file: LineWriter::new(file),
count: 0,
};
Ok(writer)
}
fn flush(&mut self) -> io::Result<()> {
self.file.flush()
}
}
impl TextWriter {
#[inline]
pub fn write_line<T>(&mut self, line: T) -> io::Result<()>
where
T: Display,
{
self.count += 1;
self.file.write_all(
&[
line.to_string().as_bytes(),
b"\n",
]
.concat(),
)
}
}
impl Seek for TextWriter {
fn seek(&mut self, pos: SeekFrom) -> io::Result<u64> {
self.file.get_ref().seek(pos)
}
}