1use std::{fs::File, io::{BufRead, BufReader, Read}, marker::PhantomData, path::Path};
2
3use serde::de::DeserializeOwned;
4use crate::deserializer::DeRecord;
5
6use crate::error::{ErrorKind, Error};
7use crate::utils::ROW_TERM_BYTE;
8
9pub struct Reader<R: Read> {
10 rdr: BufReader<R>,
11}
12
13impl<R: Read> Reader<R> {
14 pub fn from_reader(rdr: R) -> Reader<R> {
16 let rdr = BufReader::new(rdr);
17 Reader {
18 rdr,
19 }
20 }
21}
22
23impl Reader<File> {
24 pub fn from_path<P: AsRef<Path>>(path: P) -> Result<Reader<File>, Error> {
26 let f = File::open(path)?;
27
28 Ok(Reader::from_reader(f))
29 }
30}
31
32impl<'a, R: Read> Reader<R> {
33 pub fn deserialize<'de, D: DeserializeOwned>(&mut self) -> DesRecordIter<'_, D, R> {
35
36 DesRecordIter::<D, R> {
37 _priv: PhantomData,
38 rdr: self,
39 }
40 }
41
42 pub fn read_record(&mut self, mut buf: &mut Vec<u8>) -> Option<Result<(), Error>> {
43 match self.rdr.read_until(ROW_TERM_BYTE, &mut buf) {
44 Ok(0) => None,
45 Ok(_) => Some(Ok(())),
46 Err(_) => Some(Err(Error(ErrorKind::Deserialize(
47 "Failed to read record".to_owned()
48 )))),
49 }
50 }
51
52
53}
54
55
56pub struct DesRecordIter<'a, D: DeserializeOwned, R: Read> {
57 rdr: &'a mut Reader<R>,
58 _priv: PhantomData<D>
59}
60
61impl<D: DeserializeOwned, R: Read> Iterator for DesRecordIter<'_, D, R> {
62 type Item = Result<D, Error>;
63
64 fn next(&mut self) -> Option<Self::Item> {
65 let mut buf = Vec::new();
66
67 match self.rdr.read_record(&mut buf) {
68 None => None,
69 Some(Ok(())) => {
70 let mut d = DeRecord::from_ref(&buf);
71 Some(D::deserialize(&mut d))
72 },
73 Some(Err(e)) => Some(Err(e))
74 }
75 }
76}