use std::{
fs::File,
io::{BufRead, BufReader, BufWriter, Cursor, Write},
path::Path,
};
use crate::error::Error;
pub trait Parser {
fn from_reader<R: BufRead>(reader: R) -> Result<Self, Error>
where
Self: Sized;
fn read_from<P: AsRef<Path>>(path: P) -> Result<Self, Error>
where
Self: Sized,
{
let file = File::open(path).map_err(Error::Io)?;
let reader = BufReader::new(file);
Self::from_reader(reader)
}
fn to_writer<W: Write>(&self, writer: W) -> Result<(), Error>;
fn write_to<P: AsRef<Path>>(&self, path: P) -> Result<(), Error> {
let path = path.as_ref();
if let Some(parent) = path.parent() {
std::fs::create_dir_all(parent).map_err(Error::Io)?;
}
let file = File::create(path).map_err(Error::Io)?;
let writer = BufWriter::new(file);
self.to_writer(writer)
}
fn from_str(s: &str) -> Result<Self, Error>
where
Self: Sized,
{
Self::from_reader(Cursor::new(s))
}
fn from_bytes(bytes: &[u8]) -> Result<Self, Error>
where
Self: Sized,
{
Self::from_reader(Cursor::new(bytes))
}
}