pub mod region;
pub mod trie;
use std::{fmt, num::ParseIntError};
#[derive(Debug)]
pub struct RegionItem {
pub region_code: String,
pub name: String,
pub region_slice: Vec<String>,
pub discard_year: u32,
}
pub(crate) fn be_u8_slice_to_i32(bytes: &[u8]) -> i32 {
let mut res = 0;
let length = bytes.len();
for (i, b) in bytes.iter().enumerate() {
res += (*b as i32) << ((length - i - 1) * 8)
}
res
}
pub(crate) fn decode_u8_list(u8_list: &Vec<u8>) -> (Vec<u32>, u32) {
let mut four_bits: Vec<u8> = Vec::new();
for u8_val in u8_list {
four_bits.push((u8_val & 0xF0) >> 4); four_bits.push(u8_val & 0x0F); }
let mut res: Vec<u32> = Vec::new();
for i in 0..four_bits.len() / 3 {
let a = four_bits[3 * i] as u32;
let b = four_bits[3 * i + 1] as u32;
let c = four_bits[3 * i + 2] as u32;
let num = (a << 8) + (b << 4) + c;
if num >= 64 {
res.push(num);
}
}
let mut discard_year_int: u32 = 0;
let last_four_bits = &four_bits[res.len() * 3..];
for (i, &b) in last_four_bits.iter().enumerate() {
discard_year_int += (b as u32) << (4 * (last_four_bits.len() - i - 1));
}
(res, discard_year_int)
}
#[derive(Debug)]
pub enum RegionError {
IOError(std::io::Error),
ParseError(ParseIntError),
Message(String),
}
impl fmt::Display for RegionError {
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
match self {
RegionError::IOError(err) => write!(f, "IOError: {}", err),
RegionError::ParseError(err) => write!(f, "ParseError: {}", err),
RegionError::Message(msg) => write!(f, "Error: {}", msg),
}
}
}
impl std::error::Error for RegionError {}