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 = env::args().collect(); if args.len() != 3 { eprintln!("Usage: {} ", args[0]); return; } (args[1].clone(), args[2].parse::().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)); } }