bookdata/io/object/
mod.rs

1use std::io::prelude::*;
2use std::mem::drop;
3
4use anyhow::Result;
5use csv;
6use serde::Serialize;
7
8mod chunks;
9mod thread;
10
11pub use chunks::{ChunkWriter, UnchunkWriter};
12pub use thread::ThreadObjectWriter;
13
14/// Trait for writing objects to some kind of sink.
15pub trait ObjectWriter<T>: Sized {
16    /// Write one object.
17    fn write_object(&mut self, object: T) -> Result<()>;
18
19    /// Write an iterator full of objects.
20    fn write_all_objects<I>(&mut self, objects: I) -> Result<usize>
21    where
22        I: Iterator<Item = T>,
23    {
24        let mut count = 0;
25        for obj in objects {
26            self.write_object(obj)?;
27            count += 1;
28        }
29        Ok(count)
30    }
31
32    /// Finish and close the target.
33    fn finish_objects(self) -> Result<usize>;
34}
35
36/// References can be used as object writers; however, [ObjectWriter::finish] must
37/// be called on the owned writer, not a reference.  Closing the reference is a
38/// no-op.
39impl<T, W> ObjectWriter<T> for &mut W
40where
41    W: ObjectWriter<T>,
42{
43    fn write_object(&mut self, object: T) -> Result<()> {
44        (**self).write_object(object)
45    }
46
47    fn finish_objects(self) -> Result<usize> {
48        // closing a reference does *not* close the write
49        Ok(0)
50    }
51}
52
53impl<T: Serialize, W: Write> ObjectWriter<T> for csv::Writer<W> {
54    fn write_object(&mut self, object: T) -> Result<()> {
55        self.serialize(object)?;
56        Ok(())
57    }
58
59    fn finish_objects(mut self) -> Result<usize> {
60        self.flush()?;
61        drop(self);
62        Ok(0)
63    }
64}