wireless 0.1.0

Library for dealing with wireless (i.e. GSM, UMTS and LTE) cell identities.
Documentation
#[macro_use]
extern crate serde_derive;

use std::collections::BTreeMap;

pub type Countries = BTreeMap<MCC, Country>;
pub type EARFCN = u16;
#[allow(non_camel_case_types)]
pub type eNBId = u32;
pub type LocationId = u16;
pub type Locations = BTreeMap<LocationId, Location>;
pub type LTECellGlobalId = u64;
pub type LTECellId = u32;
pub type LTECells = BTreeMap<LTECellGlobalId, LTECell>;
pub type LTECellShortId = u8;
pub type MCC = u16;
pub type MNC = u16;
pub type NetworkId = u32;
pub type Networks = BTreeMap<NetworkId, Network>;
pub type PCI = u16;

#[derive(Serialize, Deserialize)]
pub struct Country {
    pub code: String,
    pub mcc: MCC,
    pub name: String,
}

#[derive(Serialize, Deserialize)]
pub struct Location {
    pub id: LocationId,
    pub name: String,
}

#[derive(Serialize, Deserialize)]
pub struct LTECell {
    pub earfcn: Option<EARFCN>,
    pub id: LTECellId,
    pub location_id: Option<LocationId>,
    pub mcc: MCC,
    pub mnc: MNC,
    pub pci: Option<PCI>,
}

#[derive(Serialize, Deserialize)]
pub struct Network {
    pub mcc: MCC,
    pub mnc: MNC,
    pub name: String,
}

impl LTECell {
    pub fn short_cid(&self) -> LTECellShortId {
        (self.id & (2 ^ 8 - 1)) as LTECellShortId
    }
    pub fn global_id(&self) -> LTECellGlobalId {
        Network::generate_id(self.mcc, self.mnc) as LTECellGlobalId + self.id as LTECellGlobalId
    }
    pub fn enb_id(&self) -> eNBId {
        self.id >> 8
    }
}

impl Network {
    pub fn generate_id(mcc: MCC, mnc: MNC) -> NetworkId {
        ((mcc as NetworkId) << 12) + (mnc as NetworkId)
    }
    pub fn id(&self) -> NetworkId {
        Network::generate_id(self.mcc, self.mnc)
    }
}