1use crate::data::Geoname;
2use std::error::Error;
3
4#[derive(Debug, Clone)]
5pub struct Parser {
6 inner: Vec<Geoname>,
7}
8impl Parser {
9 pub fn new() -> Self {
10 Parser { inner: Vec::new() }
11 }
12
13 pub fn parse(&mut self, path: std::path::PathBuf) -> Result<&Parser, Box<dyn Error>> {
14 let mut rdr = csv::ReaderBuilder::new()
15 .has_headers(false)
16 .delimiter(b'\t')
17 .flexible(true)
18 .from_path(path)?;
19 for result in rdr.deserialize() {
20 let record: Geoname = result?;
21 self.inner.push(record);
22 }
23 Ok(self)
24 }
25}
26
27impl IntoIterator for Parser {
28 type Item = Geoname;
29 type IntoIter = ::std::vec::IntoIter<Self::Item>;
30
31 fn into_iter(self) -> Self::IntoIter {
32 self.inner.into_iter()
33 }
34}