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