diff --git a/src/main.rs b/src/main.rs index 35d83a5..0b7a6e3 100644 --- a/src/main.rs +++ b/src/main.rs @@ -38,9 +38,51 @@ fn main() { } fn validate(map: &HashMap, key: &str) -> bool { - if let Some(v) = map.get(key) { - !v.is_empty() - } else { - false + match (key, map.get(key)) { + ("byr", Some(v)) => { + let byr = v.parse::().unwrap(); + byr >= 1920 && byr <= 2002 + } + ("iyr", Some(v)) => { + let iyr = v.parse::().unwrap(); + iyr >= 2010 && iyr <= 2020 + } + ("eyr", Some(v)) => { + let eyr = v.parse::().unwrap(); + eyr >= 2020 && eyr <= 2030 + } + ("hgt", Some(v)) => { + if v.contains("cm") { + let v = v.trim_end_matches(char::is_alphabetic); + let v = v.parse::().unwrap(); + v >= 150 && v <= 193 + } else if v.contains("in") { + let v = v.trim_end_matches(char::is_alphabetic); + let v = v.parse::().unwrap(); + v >= 59 && v <= 76 + } else { + false + } + } + ("hcl", Some(v)) => { + v.starts_with('#') + && v.chars() + .skip(1) + .filter(|x| match x { + '0'..='9' => true, + 'a'..='f' => true, + _ => false, + }) + .count() + == 6 + } + ("ecl", Some(v)) => match v.as_ref() { + "amb" | "blu" | "brn" | "gry" | "grn" | "hzl" | "oth" => true, + _ => false, + }, + ("pid", Some(v)) => v.len() == 9 && v.chars().filter(|&x| char::is_numeric(x)).count() == 9, + ("cid", _) => true, + (_, None) => false, + (_, _) => unreachable!(), } }