csvsc/
flush.rs

1use crate::{
2    Headers, RowResult, RowStream,
3    error::Result,
4};
5
6mod target;
7
8pub use target::{Target, TargetManager};
9
10/// Flushes the rows to the destination specified by a column.
11///
12/// Fields starting with underscore are not written.
13pub struct Flush<I, T> {
14    iter: I,
15    target: T,
16    headers: Headers,
17}
18
19impl<I, T> Flush<I, T>
20where
21    I: RowStream,
22{
23    pub fn new(iter: I, target: T) -> Result<Flush<I, T>> {
24        let headers = iter.headers().clone();
25
26        Ok(Flush { iter, target, headers })
27    }
28}
29
30pub struct IntoIter<I, T> {
31    headers: Headers,
32    target: T,
33    iter: I,
34}
35
36
37impl<I, T> Iterator for IntoIter<I, T>
38where
39    I: Iterator<Item = RowResult>,
40    T: TargetManager,
41{
42    type Item = RowResult;
43
44    fn next(&mut self) -> Option<Self::Item> {
45        match self.iter.next() {
46            Some(Ok(row)) => {
47                if let Err(e) = self.target.write_row(&self.headers, &row) {
48                    Some(Err(e))
49                } else {
50                    Some(Ok(row))
51                }
52            },
53            err @ Some(Err(_)) => err,
54            None => None,
55        }
56    }
57}
58
59impl<I, T> IntoIterator for Flush<I, T>
60where
61    I: RowStream,
62    T: TargetManager,
63{
64    type Item = RowResult;
65
66    type IntoIter = IntoIter<I::IntoIter, T>;
67
68    fn into_iter(self) -> Self::IntoIter {
69        IntoIter {
70            target: self.target,
71            headers: self.iter.headers().clone(),
72            iter: self.iter.into_iter(),
73        }
74    }
75}
76
77impl<I, T> RowStream for Flush<I, T>
78where
79    I: RowStream,
80    T: TargetManager,
81{
82    fn headers(&self) -> &Headers {
83        &self.headers
84    }
85}