bookdata/io/object/
transform.rs

1use std::marker::PhantomData;
2
3use anyhow::Result;
4
5use super::ObjectWriter;
6
7/// Writer that applies a transform to an underlying writer.
8pub struct MapWriter<F, T1, T2, W>
9where
10    W: ObjectWriter<T2>,
11    F: Fn(T1) -> Result<T2>,
12{
13    pub(crate) _phantom: PhantomData<(T1, T2)>,
14    pub(crate) transform: F,
15    pub(crate) writer: W,
16}
17
18impl<F, T1, T2, W> ObjectWriter<T1> for MapWriter<F, T1, T2, W>
19where
20    W: ObjectWriter<T2>,
21    F: Fn(T1) -> Result<T2>,
22{
23    fn write_object(&mut self, object: T1) -> Result<()> {
24        let mapped = (self.transform)(object)?;
25        self.writer.write_object(mapped)
26    }
27
28    fn finish(self) -> Result<usize> {
29        self.writer.finish()
30    }
31}