Skip to main content

geonames/
parser.rs

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}