1 #![allow(dead_code)]
2 use std::{error::Error, io, process};
3 
4 use serde::Deserialize;
5 
6 #[derive(Debug, Deserialize)]
7 #[serde(rename_all = "PascalCase")]
8 struct Record<'a> {
9     country: &'a [u8],
10     city: &'a [u8],
11     accent_city: &'a [u8],
12     region: &'a [u8],
13     population: Option<u64>,
14     latitude: f64,
15     longitude: f64,
16 }
17 
run() -> Result<u64, Box<dyn Error>>18 fn run() -> Result<u64, Box<dyn Error>> {
19     let mut rdr = csv::Reader::from_reader(io::stdin());
20     let mut raw_record = csv::ByteRecord::new();
21     let headers = rdr.byte_headers()?.clone();
22 
23     let mut count = 0;
24     while rdr.read_byte_record(&mut raw_record)? {
25         let record: Record = raw_record.deserialize(Some(&headers))?;
26         if record.country == b"us" && record.region == b"MA" {
27             count += 1;
28         }
29     }
30     Ok(count)
31 }
32 
main()33 fn main() {
34     match run() {
35         Ok(count) => {
36             println!("{}", count);
37         }
38         Err(err) => {
39             println!("{}", err);
40             process::exit(1);
41         }
42     }
43 }
44