From 98e0320e87baab8f64f03813ad2a8210f213be4d Mon Sep 17 00:00:00 2001 From: Ammar Hussein Date: Sun, 16 Nov 2025 20:46:29 -0800 Subject: [PATCH 1/2] PlayerScore has a Player value --- src/csv_io.rs | 10 +++++----- src/data.rs | 10 ++++------ 2 files changed, 9 insertions(+), 11 deletions(-) diff --git a/src/csv_io.rs b/src/csv_io.rs index 8f3f4d4..d1a6412 100644 --- a/src/csv_io.rs +++ b/src/csv_io.rs @@ -29,8 +29,8 @@ pub fn write_player_scores( // Write data for score in player_scores { writer.write_record(&[ - &score.username, - &score.team, + &score.player.username, + &score.player.team, &score.total_score.to_string(), ])?; } @@ -83,7 +83,7 @@ pub fn write_territory_scores( // Write data for score in player_scores { - let mut row = vec![score.username.clone(), score.team.clone()]; + let mut row = vec![score.player.username.clone(), score.player.team.clone()]; for territory in &territories { let territory_score = score.territory_scores.get(territory).unwrap_or(&0); @@ -104,8 +104,8 @@ pub fn calculate_team_scores(player_scores: &[PlayerScore]) -> Vec { for player_score in player_scores { let team_score = team_map - .entry(player_score.team.clone()) - .or_insert_with(|| TeamScore::new(player_score.team.clone())); + .entry(player_score.player.team.clone()) + .or_insert_with(|| TeamScore::new(player_score.player.team.clone())); for (territory, score) in &player_score.territory_scores { team_score.add_territory_score(territory.clone(), *score); diff --git a/src/data.rs b/src/data.rs index f18ded6..bf2f00e 100644 --- a/src/data.rs +++ b/src/data.rs @@ -9,8 +9,7 @@ pub struct Player { #[derive(Debug, Clone, Serialize)] pub struct PlayerScore { - pub username: String, - pub team: String, + pub player: Player, pub total_score: i32, pub territory_scores: HashMap, } @@ -18,8 +17,7 @@ pub struct PlayerScore { impl PlayerScore { pub fn new(player: Player) -> Self { PlayerScore { - username: player.username, - team: player.team, + player: player, total_score: 0, territory_scores: HashMap::new(), } @@ -72,8 +70,8 @@ mod tests { let player_score = PlayerScore::new(player.clone()); - assert_eq!(player_score.username, "testuser"); - assert_eq!(player_score.team, "TestTeam"); + assert_eq!(player_score.player.username, "testuser"); + assert_eq!(player_score.player.team, "TestTeam"); assert_eq!(player_score.total_score, 0); assert!(player_score.territory_scores.is_empty()); } From d450d79ddac20d79e62e0325ba546168efdecf1e Mon Sep 17 00:00:00 2001 From: Ammar Hussein Date: Sun, 16 Nov 2025 22:00:37 -0800 Subject: [PATCH 2/2] 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]