1use crate::{
2 Headers, RowResult, RowStream,
3 error::Result,
4};
5
6mod target;
7
8pub use target::{Target, TargetManager};
9
10pub 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}