use std::fmt::Debug;
use std::marker::PhantomData;
use log::info;
use crate::core::item::{ItemWriter, ItemWriterResult};
pub struct LoggerWriter<T> {
_pd: PhantomData<T>,
}
impl<T: Debug> ItemWriter<T> for LoggerWriter<T> {
fn write(&self, items: &[T]) -> ItemWriterResult {
items.iter().for_each(|item| info!("Record:{:?}", item));
Ok(())
}
}
#[derive(Default)]
pub struct LoggerWriterBuilder<T> {
_pd: PhantomData<T>,
}
impl<T> LoggerWriterBuilder<T> {
pub fn new() -> Self {
Self { _pd: PhantomData }
}
pub fn build(self) -> LoggerWriter<T> {
LoggerWriter { _pd: PhantomData }
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_write() {
let writer = LoggerWriterBuilder::<i32>::new().build();
let items = vec![1, 2, 3];
let result = writer.write(&items);
assert!(result.is_ok());
}
#[test]
fn test_builder_new() {
let builder = LoggerWriterBuilder::<String>::new();
let _writer = builder.build();
}
#[test]
fn test_builder_default() {
let builder = LoggerWriterBuilder::<String>::default();
let _writer = builder.build();
}
#[test]
fn test_write_with_custom_type() {
#[derive(Debug)]
struct Record {
id: u32,
}
let writer = LoggerWriterBuilder::<Record>::new().build();
let items = vec![Record { id: 1 }];
let result = writer.write(&items);
assert!(result.is_ok());
}
#[test]
fn test_write_empty_items() {
let writer = LoggerWriterBuilder::<i32>::new().build();
let items: Vec<i32> = vec![];
let result = writer.write(&items);
assert!(result.is_ok());
}
}