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