use mongodb::{options::InsertManyOptions, sync::Collection};
use crate::{
BatchError,
core::item::{ItemWriter, ItemWriterResult},
};
pub struct MongodbItemWriter<'a, O: Send + Sync> {
collection: &'a Collection<O>,
}
impl<O: serde::Serialize + Send + Sync> ItemWriter<O> for MongodbItemWriter<'_, O> {
fn write(&self, items: &[O]) -> ItemWriterResult {
let opts = InsertManyOptions::builder().ordered(false).build();
let result = self.collection.insert_many(items).with_options(opts).run();
match result {
Ok(_ser) => Ok(()),
Err(error) => Err(BatchError::ItemWriter(error.to_string())),
}
}
}
#[derive(Default)]
pub struct MongodbItemWriterBuilder<'a, O: Send + Sync> {
collection: Option<&'a Collection<O>>,
}
impl<'a, O: Send + Sync> MongodbItemWriterBuilder<'a, O> {
pub fn new() -> Self {
Self { collection: None }
}
pub fn collection(mut self, collection: &'a Collection<O>) -> MongodbItemWriterBuilder<'a, O> {
self.collection = Some(collection);
self
}
pub fn build(&self) -> MongodbItemWriter<'a, O> {
MongodbItemWriter {
collection: self.collection.unwrap(),
}
}
}