ip2location_continent_multilingual/
csv_format.rs

1use core::ops::Deref;
2use std::io::Read;
3
4use csv::{Error as CsvError, Reader};
5
6use crate::record::Record;
7
8//
9#[cfg(feature = "once_cell")]
10pub static RECORDS: once_cell::sync::Lazy<Records> = once_cell::sync::Lazy::new(|| {
11    let csv = include_str!("../data/IP2LOCATION-CONTINENT-MULTILINGUAL.CSV");
12    Records::from_csv(csv.as_bytes()).unwrap()
13});
14
15//
16#[derive(Debug, Clone)]
17pub struct Records(pub Vec<Record>);
18
19impl Deref for Records {
20    type Target = Vec<Record>;
21
22    fn deref(&self) -> &Self::Target {
23        &self.0
24    }
25}
26
27//
28impl Records {
29    pub fn from_csv<R: Read>(rdr: R) -> Result<Self, RecordsFromCsvError> {
30        let mut rdr = Reader::from_reader(rdr);
31
32        let mut inner = vec![];
33
34        for record in rdr.records() {
35            let record = record.map_err(RecordsFromCsvError::CsvParseFailed)?;
36            let row: Record = record
37                .deserialize(None)
38                .map_err(RecordsFromCsvError::RecordDeFailed)?;
39            inner.push(row);
40        }
41
42        Ok(Self(inner))
43    }
44}
45
46//
47#[derive(Debug)]
48pub enum RecordsFromCsvError {
49    CsvParseFailed(CsvError),
50    RecordDeFailed(CsvError),
51}
52
53impl core::fmt::Display for RecordsFromCsvError {
54    fn fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result {
55        write!(f, "{self:?}")
56    }
57}
58
59impl std::error::Error for RecordsFromCsvError {}