//! CSV output for simulation snapshots. use std::fs::File; use std::io::{self, BufWriter, Write}; use std::path::Path; use crate::model::TickRecord; /// Write records to CSV. If `path` is None, writes to stdout. /// /// Columns: node_id, commodity_id, supply, demand, price, tick, /// shadow_intensity, tractus_mark_rate pub fn write_csv(records: &[TickRecord], path: Option<&Path>) -> io::Result<()> { let header = "node_id,commodity_id,supply,demand,price,tick,shadow_intensity,tractus_mark_rate\n"; let write_record = |w: &mut dyn Write, r: &TickRecord| -> io::Result<()> { writeln!( w, "{},{},{:.4},{:.4},{:.4},{},{:.4},{:.6}", r.node_id, r.commodity_id, r.supply, r.demand, r.price, r.tick, r.shadow_intensity, r.tractus_mark_rate, ) }; match path { Some(p) => { let file = File::create(p)?; let mut w = BufWriter::new(file); write!(w, "{}", header)?; for r in records { write_record(&mut w, r)?; } w.flush() } None => { let stdout = io::stdout(); let mut w = BufWriter::new(stdout.lock()); write!(w, "{}", header)?; for r in records { write_record(&mut w, r)?; } w.flush() } } }