break team scores per territory

This commit is contained in:
2025-11-16 22:00:37 -08:00
parent 98e0320e87
commit d450d79dda

View File

@ -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<dyn Error>> {
let mut writer = Writer::from_path(file_path)?;
let mut territories: HashSet<String> = HashSet::new();
for score in team_scores.iter() {
for (territory, _) in score.territory_scores.clone() {
territories.insert(territory);
}
}
let territories: Vec<String> = 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]