use csv;
use serde::{de, Deserialize, Deserializer};
use std::error::Error;
use std::fmt::Display;
use std::fs::File;
use std::str::FromStr;
#[allow(dead_code)]
pub fn date_from_str<'de, S, D>(deserializer: D) -> Result<S, D::Error>
where
S: FromStr, S::Err: Display, D: Deserializer<'de>,
{
let s: String = Deserialize::deserialize(deserializer)?;
S::from_str(&s).map_err(de::Error::custom)
}
pub fn rec_to_struct<'a, A: serde::Deserialize<'a>>(
record: &'a csv::StringRecord,
) -> Result<A, csv::Error> {
record.deserialize(None)
}
pub fn parse_init_file(file: File) -> Result<csv::Reader<File>, Box<dyn Error>> {
let rdr = csv::ReaderBuilder::new()
.delimiter(b',')
.flexible(true)
.from_reader(file);
Ok(rdr)
}
pub fn parse_records<'a, A: std::io::Read>(
byteiter: csv::ByteRecordsIter<'a, A>,
) -> impl Iterator<Item = csv::StringRecord> + 'a {
byteiter.map(|x| csv::StringRecord::from_byte_record_lossy(x.expect("Error in parse_records")))
}
#[allow(dead_code)]
pub fn parse_record(rec: csv::ByteRecord) -> csv::StringRecord {
csv::StringRecord::from_byte_record_lossy(rec)
}