57 lines
1.5 KiB
Rust
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));
|
|
}
|
|
}
|
|
|