break team scores per territory
This commit is contained in:
@ -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]
|
||||
|
||||
Reference in New Issue
Block a user