Skip to main content

spring_batch_rs/item/
logger.rs

1use std::fmt::Debug;
2use std::marker::PhantomData;
3
4use log::info;
5
6use crate::core::item::{ItemWriter, ItemWriterResult};
7
8/// A simple item writer that logs the items using the `log` crate.
9///
10/// This writer is created using the [`LoggerWriterBuilder`].
11///
12/// # Examples
13///
14/// ```
15/// use spring_batch_rs::item::logger::LoggerWriterBuilder;
16/// use spring_batch_rs::core::item::ItemWriter;
17///
18/// let writer = LoggerWriterBuilder::<i32>::new().build();
19/// let items = vec![1, 2, 3];
20/// let result = writer.write(&items);
21/// assert!(result.is_ok());
22/// ```
23pub struct LoggerWriter<T> {
24    _pd: PhantomData<T>,
25}
26
27impl<T: Debug> ItemWriter<T> for LoggerWriter<T> {
28    /// Writes the items to the log.
29    ///
30    /// # Arguments
31    ///
32    /// * `items` - The items to be written.
33    ///
34    /// # Returns
35    ///
36    /// Returns `Ok(())` if the items were successfully written to the log.
37    ///
38    /// # Examples
39    ///
40    /// ```
41    /// use spring_batch_rs::item::logger::LoggerWriterBuilder;
42    /// use spring_batch_rs::core::item::{ItemWriter, ItemWriterResult};
43    ///
44    /// let writer = LoggerWriterBuilder::<i32>::new().build();
45    /// let items = vec![1, 2, 3];
46    /// let result: ItemWriterResult = writer.write(&items);
47    /// assert!(result.is_ok());
48    /// ```
49    fn write(&self, items: &[T]) -> ItemWriterResult {
50        items.iter().for_each(|item| info!("Record:{:?}", item));
51        Ok(())
52    }
53}
54
55/// A builder for creating logger writers.
56///
57/// This builder provides a consistent API for creating [`LoggerWriter`] instances,
58/// following the same pattern as other writers in the framework.
59///
60/// # Examples
61///
62/// ```
63/// use spring_batch_rs::item::logger::LoggerWriterBuilder;
64/// use spring_batch_rs::core::item::ItemWriter;
65///
66/// let writer = LoggerWriterBuilder::<i32>::new().build();
67/// writer.write(&[1, 2, 3]).unwrap();
68/// ```
69///
70/// Using with custom types:
71///
72/// ```
73/// use spring_batch_rs::item::logger::LoggerWriterBuilder;
74/// use spring_batch_rs::core::item::ItemWriter;
75///
76/// #[derive(Debug)]
77/// struct Record {
78///     id: u32,
79///     value: String,
80/// }
81///
82/// let writer = LoggerWriterBuilder::<Record>::new().build();
83/// let items = vec![
84///     Record { id: 1, value: "test".to_string() },
85/// ];
86/// writer.write(&items).unwrap();
87/// ```
88#[derive(Default)]
89pub struct LoggerWriterBuilder<T> {
90    _pd: PhantomData<T>,
91}
92
93impl<T> LoggerWriterBuilder<T> {
94    /// Creates a new logger writer builder.
95    ///
96    /// # Examples
97    ///
98    /// ```
99    /// use spring_batch_rs::item::logger::LoggerWriterBuilder;
100    ///
101    /// let builder = LoggerWriterBuilder::<String>::new();
102    /// ```
103    pub fn new() -> Self {
104        Self { _pd: PhantomData }
105    }
106
107    /// Builds a [`LoggerWriter`] instance.
108    ///
109    /// # Returns
110    ///
111    /// A configured [`LoggerWriter`] instance.
112    ///
113    /// # Examples
114    ///
115    /// ```
116    /// use spring_batch_rs::item::logger::LoggerWriterBuilder;
117    /// use spring_batch_rs::core::item::ItemWriter;
118    ///
119    /// let writer = LoggerWriterBuilder::<i32>::new().build();
120    /// writer.write(&[1, 2, 3]).unwrap();
121    /// ```
122    pub fn build(self) -> LoggerWriter<T> {
123        LoggerWriter { _pd: PhantomData }
124    }
125}
126
127#[cfg(test)]
128mod tests {
129    use super::*;
130
131    #[test]
132    fn test_write() {
133        let writer = LoggerWriterBuilder::<i32>::new().build();
134        let items = vec![1, 2, 3];
135        let result = writer.write(&items);
136        assert!(result.is_ok());
137    }
138
139    #[test]
140    fn test_builder_new() {
141        let builder = LoggerWriterBuilder::<String>::new();
142        let _writer = builder.build();
143    }
144
145    #[test]
146    fn test_builder_default() {
147        let builder = LoggerWriterBuilder::<String>::default();
148        let _writer = builder.build();
149    }
150
151    #[test]
152    fn test_write_with_custom_type() {
153        #[derive(Debug)]
154        struct Record {
155            id: u32,
156        }
157
158        let writer = LoggerWriterBuilder::<Record>::new().build();
159        let items = vec![Record { id: 1 }];
160        let result = writer.write(&items);
161        assert!(result.is_ok());
162    }
163
164    #[test]
165    fn test_write_empty_items() {
166        let writer = LoggerWriterBuilder::<i32>::new().build();
167        let items: Vec<i32> = vec![];
168        let result = writer.write(&items);
169        assert!(result.is_ok());
170    }
171}