ip2location_continent_multilingual/
csv_format.rs1use core::ops::Deref;
2use std::io::Read;
3
4use csv::{Error as CsvError, Reader};
5
6use crate::record::Record;
7
8#[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#[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
27impl 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#[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 {}