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}