rsv_core/
reader.rs

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    /// Creates a new buffered reader from any struct that implements the Read trait.
15    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    /// Creates a new buffered reader from a file path.
25    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    /// Returns an iterator that will continuously decode records from the underlying reader.
34    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}