From d450d79ddac20d79e62e0325ba546168efdecf1e Mon Sep 17 00:00:00 2001 From: Ammar Hussein Date: Sun, 16 Nov 2025 22:00:37 -0800 Subject: [PATCH] break team scores per territory --- src/csv_io.rs | 26 ++++++++++++++++++++------ 1 file changed, 20 insertions(+), 6 deletions(-) diff --git a/src/csv_io.rs b/src/csv_io.rs index d1a6412..d25d263 100644 --- a/src/csv_io.rs +++ b/src/csv_io.rs @@ -1,4 +1,4 @@ -use std::{collections::HashMap, error::Error}; +use std::{collections::{HashMap, HashSet}, error::Error}; use csv::{Reader, Writer}; use crate::data::{Player, PlayerScore, TeamScore}; @@ -45,13 +45,27 @@ pub fn write_team_scores( team_scores: &[TeamScore], ) -> Result<(), Box> { let mut writer = Writer::from_path(file_path)?; + let mut territories: HashSet = HashSet::new(); + for score in team_scores.iter() { + for (territory, _) in score.territory_scores.clone() { + territories.insert(territory); + } + } + let territories: Vec = territories.into_iter().collect(); // Write header - writer.write_record(&["team", "total_score"])?; + let mut header = vec![String::from("team")]; + header.append(&mut territories.clone()); + writer.write_record(&header)?; // Write data for score in team_scores { - writer.write_record(&[&score.team, &score.total_score.to_string()])?; + let mut scores = vec![score.team.clone()]; + let default = 0; + for territory in territories.clone() { + scores.push(score.territory_scores.get(&territory).unwrap_or(&default).to_string()); + } + writer.write_record(scores)?; } writer.flush()?; @@ -187,9 +201,9 @@ mod tests { write_team_scores(file_path, &team_scores).unwrap(); let content = fs::read_to_string(file_path).unwrap(); - assert!(content.contains("team,total_score")); - assert!(content.contains("Red Team,20")); - assert!(content.contains("Blue Team,15")); + assert!(content.contains("team,Capitol Hill,Downtown")); + assert!(content.contains("Red Team,20,0")); + assert!(content.contains("Blue Team,0,15")); } #[test]