[READ-ONLY] Mirror of https://github.com/probablykasper/csv-pipeline.
0

Configure Feed

Select the types of activity you want to include in your feed.

Add map method

Kasper (Jan 9, 2023, 7:05 AM +0100) 5c0f99e6 bcea5587

+37 -1
+13 -1
src/pipeline.rs
··· 1 1 use super::headers::Headers; 2 - use crate::pipeline_iterators::{AddCol, Flush}; 2 + use crate::pipeline_iterators::{AddCol, Flush, Map}; 3 3 use crate::target::Target; 4 4 use crate::{Error, Row, RowResult}; 5 5 use csv::{Reader, ReaderBuilder, StringRecordsIntoIter}; ··· 55 55 { 56 56 self.headers.push_field(name); 57 57 self.iterator = Box::new(AddCol { 58 + iterator: self.iterator, 59 + f: get_value, 60 + headers: self.headers.clone(), 61 + }); 62 + self 63 + } 64 + 65 + pub fn map<F>(mut self, get_value: F) -> Self 66 + where 67 + F: FnMut(&Headers, Row) -> Result<Row, Error> + 'a, 68 + { 69 + self.iterator = Box::new(Map { 58 70 iterator: self.iterator, 59 71 f: get_value, 60 72 headers: self.headers.clone(),
+24
src/pipeline_iterators.rs
··· 30 30 } 31 31 } 32 32 33 + pub struct Map<I, F: FnMut(&Headers, Row) -> Result<Row, Error>> { 34 + pub iterator: I, 35 + pub f: F, 36 + pub headers: Headers, 37 + } 38 + impl<I, F> Iterator for Map<I, F> 39 + where 40 + I: Iterator<Item = RowResult>, 41 + F: FnMut(&Headers, Row) -> Result<Row, Error>, 42 + { 43 + type Item = RowResult; 44 + 45 + fn next(&mut self) -> Option<Self::Item> { 46 + let row = match self.iterator.next()? { 47 + Ok(row) => row, 48 + Err(e) => return Some(Err(e)), 49 + }; 50 + match (self.f)(&self.headers, row) { 51 + Ok(value) => Some(Ok(value)), 52 + Err(e) => Some(Err(e)), 53 + } 54 + } 55 + } 56 + 33 57 pub struct Flush<I, T> { 34 58 pub iterator: I, 35 59 pub target: T,