1use std::{
4 fs::File,
5 io::{BufRead, BufReader, BufWriter, Cursor, Write},
6 path::Path,
7};
8
9use crate::error::Error;
10
11pub trait Parser {
22 fn from_reader<R: BufRead>(reader: R) -> Result<Self, Error>
24 where
25 Self: Sized;
26
27 fn read_from<P: AsRef<Path>>(path: P) -> Result<Self, Error>
29 where
30 Self: Sized,
31 {
32 let file = File::open(path).map_err(Error::Io)?;
33 let reader = BufReader::new(file);
34 Self::from_reader(reader)
35 }
36
37 fn to_writer<W: Write>(&self, writer: W) -> Result<(), Error>;
39
40 fn write_to<P: AsRef<Path>>(&self, path: P) -> Result<(), Error> {
43 let path = path.as_ref();
44 if let Some(parent) = path.parent() {
45 std::fs::create_dir_all(parent).map_err(Error::Io)?;
46 }
47 let file = File::create(path).map_err(Error::Io)?;
48 let writer = BufWriter::new(file);
49 self.to_writer(writer)
50 }
51
52 fn from_str(s: &str) -> Result<Self, Error>
54 where
55 Self: Sized,
56 {
57 Self::from_reader(Cursor::new(s))
58 }
59
60 fn from_bytes(bytes: &[u8]) -> Result<Self, Error>
62 where
63 Self: Sized,
64 {
65 Self::from_reader(Cursor::new(bytes))
66 }
67}