use std::{
fs::File,
io::{BufReader, BufWriter, Read, Write},
};
use crate::types::Result;
pub trait CsvIO: Sized {
fn from_csv_reader<R: Read>(reader: R) -> Result<Self>;
fn to_csv_writer<W: Write>(&self, writer: W) -> Result<()>;
fn from_csv_string(csv: &str) -> Result<Self> {
Self::from_csv_reader(csv.as_bytes())
}
fn to_csv_string(&self) -> Result<String> {
let mut buffer = Vec::new();
self.to_csv_writer(&mut buffer)?;
String::from_utf8(buffer).map_err(Into::into)
}
fn from_csv_file(path: &str) -> Result<Self> {
let file = File::open(path)?;
let reader = BufReader::new(file);
Self::from_csv_reader(reader)
}
fn to_csv_file(&self, path: &str) -> Result<()> {
let file = File::create(path)?;
let writer = BufWriter::new(file);
self.to_csv_writer(writer)
}
}