Split readers/writers into separate module

This commit is contained in:
Piv
2023-07-28 20:28:58 +09:30
parent fc633153bb
commit 12add6e5c1
4 changed files with 68 additions and 25 deletions

53
src/io.rs Normal file
View File

@@ -0,0 +1,53 @@
use std::{
collections::HashMap,
io::{Read, Write},
};
use anyhow::bail;
use csv::DeserializeRecordsIter;
use rmp_serde::{Deserializer, Serializer};
use serde::{de::DeserializeOwned, Serialize};
pub trait RecordSerializer {
fn serialize(&mut self, record: impl Serialize) -> anyhow::Result<()>;
}
impl<W: Write> RecordSerializer for csv::Writer<W> {
fn serialize(&mut self, record: impl Serialize) -> anyhow::Result<()> {
self.serialize(record)?;
Ok(())
}
}
impl<W: Write> RecordSerializer for Serializer<W> {
fn serialize(&mut self, record: impl Serialize) -> anyhow::Result<()> {
record.serialize(self)?;
Ok(())
}
}
// TODO: Want to be able to deserialise with serde over a reader like we currently do with the writer
// pub trait RecordDeserializer<D: DeserializeOwned, I: Iterator<Item = Result<D, anyhow::Error>>> {
// fn deserialize<I>(&mut self) -> I;
// }
// impl<R: Read, D: DeserializeOwned, I: Iterator<Item = Result<D, anyhow::Error>>>
// RecordDeserializer<D, I> for csv::Reader<R>
// {
// fn deserialize(&mut self) -> I {
// self.deserialize().into_iter().map(|r| match r {
// Ok(ok) => Ok(ok),
// Err(err) => bail!(err),
// })
// }
// }
// impl<R: Read> RecordDeserializer for Deserializer<R> {
// fn deserialize<I, D>(&mut self) -> I
// where
// D: DeserializeOwned,
// I: Iterator<Item = D>,
// {
// todo!()
// }
// }