use spring_batch_rs::{
BatchError,
core::{
job::{Job, JobBuilder},
step::StepBuilder,
},
tasklet::s3::{get::S3GetTaskletBuilder, put::S3PutTaskletBuilder},
};
use std::env::temp_dir;
use std::fs;
#[tokio::main]
async fn main() -> Result<(), BatchError> {
let upload_path = temp_dir().join("spring_batch_s3_sample.csv");
fs::write(&upload_path, "id,name\n1,Alice\n2,Bob\n").unwrap(); let download_path = temp_dir().join("spring_batch_s3_downloaded.csv");
let put_tasklet = S3PutTaskletBuilder::new()
.bucket("my-batch-bucket")
.key("exports/sample.csv")
.local_file(&upload_path)
.endpoint_url("http://localhost:4566") .access_key_id("test")
.secret_access_key("test")
.region("us-east-1")
.build()?;
let get_tasklet = S3GetTaskletBuilder::new()
.bucket("my-batch-bucket")
.key("exports/sample.csv")
.local_file(&download_path)
.endpoint_url("http://localhost:4566")
.access_key_id("test")
.secret_access_key("test")
.region("us-east-1")
.build()?;
let upload_step = StepBuilder::new("s3-upload").tasklet(&put_tasklet).build();
let download_step = StepBuilder::new("s3-download")
.tasklet(&get_tasklet)
.build();
let job = JobBuilder::new()
.start(&upload_step)
.next(&download_step)
.build();
let result = job.run()?;
println!("Job status: completed");
println!("Total duration: {:?}", result.duration);
fs::remove_file(&upload_path).ok();
fs::remove_file(&download_path).ok();
Ok(())
}