use std::convert::AsRef;
use std::fs::File;
use std::io::{Cursor, Read, Write};
use std::path::Path;
use util::ResultType;
pub trait Csv: Sized {
#[inline(always)]
fn estimate_csv_size(&self) -> usize {
0
}
fn to_csv<T: Write>(&self, writer: &mut T, delimiter: u8) -> ResultType<()>;
fn to_csv_string(&self, delimiter: u8) -> ResultType<String> {
let capacity = self.estimate_csv_size();
let mut writer = Cursor::new(Vec::with_capacity(capacity));
self.to_csv(&mut writer, delimiter)?;
match String::from_utf8(writer.into_inner()) {
Err(e) => Err(Box::new(e)),
Ok(v) => Ok(v),
}
}
#[inline]
fn to_csv_file<P: AsRef<Path>>(&self, path: P, delimiter: u8) -> ResultType<()> {
let mut file = File::create(path)?;
self.to_csv(&mut file, delimiter)
}
fn from_csv<T: Read>(reader: &mut T, delimiter: u8) -> ResultType<Self>;
#[inline]
fn from_csv_string(text: &str, delimiter: u8) -> ResultType<Self> {
let mut reader = Cursor::new(text);
Self::from_csv(&mut reader, delimiter)
}
#[inline]
fn from_csv_file<P: AsRef<Path>>(path: P, delimiter: u8) -> ResultType<Self> {
let mut reader = File::open(path)?;
Self::from_csv(&mut reader, delimiter)
}
}
pub trait CsvCollection: Csv {
fn to_csv_strict<T: Write>(&self, writer: &mut T, delimiter: u8) -> ResultType<()>;
fn to_csv_lenient<T: Write>(&self, writer: &mut T, delimiter: u8) -> ResultType<()>;
fn from_csv_strict<T: Read>(reader: &mut T, delimiter: u8) -> ResultType<Self>;
fn from_csv_lenient<T: Read>(reader: &mut T, delimiter: u8) -> ResultType<Self>;
}