use std::collections::HashMap;
use serde::{Deserialize, Serialize};
#[derive(Deserialize, Serialize, Debug)]
pub struct RegionInfo {
pub code: u16,
pub name: String,
}
lazy_static! {
static ref REGIONS: HashMap<u16, RegionInfo> = load_regions_from_json();
}
pub fn lookup(code: u16) -> Option<&'static RegionInfo> {
info!("lookup_region: {}", code);
match REGIONS.get(&code) {
Some(v) => Some(v),
None => None,
}
}
pub fn all_codes() -> Vec<u16> {
REGIONS.keys().cloned().collect()
}
fn load_regions_from_json() -> HashMap<u16, RegionInfo> {
info!("load_regions_from_json - loading JSON");
let raw_data = include_bytes!("data/regions.json");
let raw_map: HashMap<String, String> = serde_json::from_slice(raw_data).unwrap();
raw_map
.iter()
.map(|(code, name)| {
(
code.parse::<u16>().unwrap(),
RegionInfo {
code: code.parse::<u16>().unwrap(),
name: name.to_string(),
},
)
})
.collect()
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_region_codes() {
let codes = all_codes();
assert!(codes.len() > 0);
}
#[test]
fn test_good_region_code() {
match lookup(21) {
None => panic!("was expecting a region"),
Some(region) => assert_eq!(region.name, "Northern America"),
}
}
#[test]
fn test_bad_region_code() {
match lookup(0) {
None => (),
Some(_) => panic!("was expecting a None in response"),
}
}
}