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
10pub 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
59pub fn get_random_cities() -> &'static City {
64 return &CITIES[random_range(0..CITIES.len())];
65}