ballot-counter/src/main.rs

57 lines
1.5 KiB
Rust

use std::env;
use counter::Counter;
use util::Percent;
pub mod util;
pub mod candidate;
pub mod ballot;
pub mod header;
pub mod party;
pub mod score_item;
mod counter;
fn main() {
let (csv_path, winner_count) = {
let args: Vec<String> = env::args().collect();
if args.len() != 3 {
eprintln!("Usage: {} <filename.csv> <winners>", args[0]);
return;
}
(args[1].clone(), args[2].parse::<usize>().unwrap())
};
let csv = quick_csv::Csv::from_file(csv_path).unwrap().flexible(true);
let counter = Counter::new(csv, winner_count).unwrap();
let mut winners = Vec::with_capacity(winner_count);
let total = counter.ballots.len() as f64;
let header = counter.header.clone();
eprintln!("Header: {:#?}", header);
eprintln!("Parties: {}", header.parties.len());
eprintln!("Candidates: {}", header.candidates.len());
eprintln!("Running election rounds:");
for (index, event) in (1..).zip(counter) {
match event {
counter::Event::Win(mut v) => {
eprintln!(" {index}: Win:");
v.sort_by(|a,b| b.cmp(a));
for winner in v.iter() {
eprintln!(" - {}, {}, {}", header.get_candidate_name(winner.index), winner.value, Percent(winner.value, total));
}
winners.extend_from_slice(&v);
}
counter::Event::Lose(v) => {
eprintln!(" {index}: Lose: {}. {}, {}", header.get_candidate_name(v.index), v.value, Percent(v.value, total));
}
}
}
eprintln!();
eprintln!("Final winners:");
for (index, winner) in (1..).zip(winners.iter()) {
eprintln!(" {index}: {}", header.get_candidate_name(winner.index));
}
}