Skip to main content

geonames_lib/model/
admin_code.rs

1use serde::{Deserialize, Serialize};
2use crate::err::{DeserializeErr};
3
4#[derive(Deserialize, Serialize, Clone, Debug)]
5pub struct AdminCode {
6    /// alpha 2
7    pub country_code: String,
8    pub code: String,
9    pub name: String,
10    /// reference geo_name
11    pub geo_name_id: i32,
12}
13
14impl AdminCode {
15    /// Receive string example
16    /// ```c
17    /// NL.16	Flevoland	Flevoland	3319179
18    /// ```
19    pub fn deserialize_from_string(str: &str) -> Result<Self, DeserializeErr> {
20        let vec = str.split("	").collect::<Vec<&str>>();
21        let code = vec[0].split(".").collect::<Vec<&str>>();
22
23        Ok(Self {
24            country_code: code[0].to_owned(),
25            code: code[1].to_owned(),
26            name: vec[1].to_owned(),
27            geo_name_id: vec[3].parse::<i32>()?,
28        })
29    }
30}
31
32#[cfg(test)]
33mod tests {
34    use crate::model::AdminCode;
35
36    #[test]
37    fn deserialize_string_to_admin_code() {
38        use std::fs::File;
39        use std::io::{BufRead, BufReader};
40
41        for line in BufReader::new(File::open("./test-data/admin1CodesASCII.txt").unwrap()).lines() {
42            let _admin_code = AdminCode::deserialize_from_string(&line.unwrap()).unwrap();
43        }
44    }
45}