cities_json/
lib.rs

1use lazy_static::lazy_static;
2use rand::random_range;
3use serde::{Deserialize, Serialize};
4use std::vec;
5
6lazy_static! {
7    pub static ref CITIES: Cities = get_cities();
8}
9
10/// ```rust
11/// use cities_json::CITIES;
12/// println!("first {:?}", CITIES.get(0).unwrap().name);
13/// ```
14pub type Cities = Vec<City>;
15
16#[derive(Debug)]
17pub struct City {
18    pub country: String,
19    pub name: String,
20    pub lat: f64,
21    pub lng: f64,
22    pub admin1: String,
23    pub admin2: String,
24}
25
26type RawCities = Vec<RawCity>;
27
28#[derive(Default, Debug, Clone, PartialEq, Serialize, Deserialize)]
29#[serde(rename_all = "camelCase")]
30struct RawCity {
31    country: String,
32    name: String,
33    lat: String,
34    lng: String,
35    admin1: String,
36    admin2: String,
37}
38
39fn load_json_data() -> Vec<u8> {
40    include_bytes!("../upstream/cities.json").to_vec()
41}
42
43fn get_cities() -> Cities {
44    let raw_cities: RawCities = serde_json::from_slice(&load_json_data()[..]).unwrap();
45    let mut cities: Cities = vec![];
46    for rawcity in raw_cities.iter() {
47        cities.push(City {
48            country: rawcity.country.to_owned(),
49            name: rawcity.name.to_owned(),
50            lat: rawcity.lat.parse::<f64>().unwrap(),
51            lng: rawcity.lng.parse::<f64>().unwrap(),
52            admin1: rawcity.admin1.to_owned(),
53            admin2: rawcity.admin2.to_owned(),
54        })
55    }
56    return cities;
57}
58
59/// ```rust
60/// use cities_json::get_random_cities;
61/// println!("random: {:?}", get_random_cities());
62/// ```
63pub fn get_random_cities() -> &'static City {
64    return &CITIES[random_range(0..CITIES.len())];
65}