use std::{
fs::File,
io::{BufReader, BufWriter, Read, Write},
};
pub trait CsvIO: Sized {
fn from_csv_reader<R: Read>(reader: R) -> Self;
fn to_csv_writer<W: Write>(&self, writer: W);
fn from_csv_string(csv: &str) -> Self {
Self::from_csv_reader(csv.as_bytes())
}
fn to_csv_string(&self) -> String {
let mut buffer = Vec::new();
self.to_csv_writer(&mut buffer);
String::from_utf8(buffer).expect("Failed to convert CSV to string.")
}
fn from_csv_file(path: &str) -> Self {
let file = File::open(path).expect("Failed to open CSV file.");
let reader = BufReader::new(file);
Self::from_csv_reader(reader)
}
fn to_csv_file(&self, path: &str) {
let file = File::create(path).expect("Failed to create CSV file.");
let writer = BufWriter::new(file);
self.to_csv_writer(writer);
}
}