X-Git-Url: http://git.scottworley.com/voter/blobdiff_plain/8133330850750d4f3382ddc3b645642eae3ea08f..82977580a924521c805fb47231bdfaf968923a15:/src/main.rs diff --git a/src/main.rs b/src/main.rs index 2e5de54..1ec9d9c 100644 --- a/src/main.rs +++ b/src/main.rs @@ -40,7 +40,7 @@ fn get_voter(request: &cgi::Request) -> Result<&[u8], cgi::Response> { let cookie = request .headers() .get(cgi::http::header::COOKIE) - .map(|c| c.as_bytes()) + .map(cgi::http::HeaderValue::as_bytes) .and_then(|c| c.strip_prefix(COOKIE_NAME)) .and_then(|c| c.strip_prefix(b"=")) .ok_or_else(|| cgi::text_response(400, "Invalid cookie"))?; @@ -51,42 +51,53 @@ fn get_voter(request: &cgi::Request) -> Result<&[u8], cgi::Response> { } } -fn tally_votes(dir: PathBuf) -> std::io::Result>> { +fn tally_votes(dir: &Path) -> std::io::Result>> { let mut tally: HashMap> = HashMap::new(); - if let Ok(vfile) = std::fs::File::open(dir.join("votes")) { - for liner in std::io::BufReader::new(vfile).lines() { - let line = liner?; - if let Some((voter, datum)) = line.split_once(' ') { - if voter.len() == COOKIE_LENGTH { - if let Some((vote, candidate)) = datum.split_once(' ') { - if vote == "0" { - if let Some(entry) = tally.get_mut(candidate) { - entry.remove(voter); + match std::fs::File::open(dir.to_owned().join("votes")) { + Err(e) if e.kind() == std::io::ErrorKind::NotFound => Ok(tally), + Err(e) => Err(e), + Ok(vfile) => { + for liner in std::io::BufReader::new(vfile).lines() { + let line = liner?; + if let Some((voter, datum)) = line.split_once(' ') { + if voter.len() == COOKIE_LENGTH { + if let Some((vote, candidate)) = datum.split_once(' ') { + if vote == "0" { + if let Some(entry) = tally.get_mut(candidate) { + entry.remove(voter); + } + } else if vote == "1" { + tally + .entry(candidate.to_owned()) + .or_default() + .insert(voter.to_owned()); } - } else if vote == "1" { - tally - .entry(candidate.to_owned()) - .or_default() - .insert(voter.to_owned()); } } } } + Ok(tally) } } - Ok(tally) } -fn valid_id_char(c: &u8) -> bool { - (b'A'..=b'Z').contains(c) || (b'a'..=b'z').contains(c) || (b'0'..=b'9').contains(c) +fn read_elim_list(dir: &Path) -> std::io::Result> { + match std::fs::File::open(dir.join("eliminated")) { + Err(e) if e.kind() == std::io::ErrorKind::NotFound => Ok(HashSet::new()), + Err(e) => Err(e), + Ok(elimfile) => std::io::BufReader::new(elimfile).lines().collect(), + } +} + +fn valid_id_char(c: u8) -> bool { + c.is_ascii_alphanumeric() } fn make_random_id() -> [u8; COOKIE_LENGTH] { let mut id = [0; COOKIE_LENGTH]; - for c in id.iter_mut() { - while !valid_id_char(c) - { - *c = random() + for c in &mut id { + while !valid_id_char(*c) { + *c = random(); } } id @@ -118,6 +129,7 @@ const HTML_HEADER: &str = "