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