use serde::{Deserialize, Serialize};
use spring_batch_rs::{
BatchError,
core::{
item::{CompositeItemWriterBuilder, PassThroughProcessor},
job::{Job, JobBuilder},
step::StepBuilder,
},
item::{
csv::csv_reader::CsvItemReaderBuilder, json::json_writer::JsonItemWriterBuilder,
logger::LoggerWriterBuilder,
},
};
use std::env::temp_dir;
#[derive(Debug, Deserialize, Serialize, Clone)]
struct Product {
id: u32,
name: String,
price: f64,
}
fn main() -> Result<(), BatchError> {
let csv = "\
id,name,price
1,Widget,9.99
2,Gadget,24.50
3,Doohickey,4.75
4,Thingamajig,14.00
5,Whatsit,2.99";
let reader = CsvItemReaderBuilder::<Product>::new()
.has_headers(true)
.from_reader(csv.as_bytes());
let output = temp_dir().join("products.json");
let json_writer = JsonItemWriterBuilder::<Product>::new().from_path(&output);
let logger_writer = LoggerWriterBuilder::<Product>::new().build();
let composite = CompositeItemWriterBuilder::new(logger_writer)
.link(json_writer)
.build();
let processor = PassThroughProcessor::<Product>::new();
let step = StepBuilder::new("fan-out-products")
.chunk::<Product, Product>(10)
.reader(&reader)
.processor(&processor)
.writer(&composite)
.build();
let job = JobBuilder::new().start(&step).build();
job.run()?;
let exec = job.get_step_execution("fan-out-products").unwrap(); println!("JSON output: {}", output.display());
println!("Read: {}", exec.read_count); println!("Processed: {}", exec.process_count); println!("Written: {}", exec.write_count);
Ok(())
}