wireless 0.2.1

Library for dealing with wireless (i.e. GSM, UMTS and LTE) cell identities.
Documentation
extern crate rustyline;
extern crate wireless;

mod json;
mod stdin;

use rustyline::Editor;
use rustyline::error::ReadlineError;
use wireless::{Countries, Country, LTECell, LTECells, Network, Networks};

pub struct Data {
    countries: Countries,
    lte_cells: LTECells,
    networks: Networks,
}

fn main() {
    println!("Welcome to wireless-cli. Type ? for help or ^D to quit.");
    let mut data = json::read();
    let mut editor = Editor::<()>::new();
    loop {
        match editor.readline(">> ") {
            Ok(a) => {
                if a == "ac" {
                    add_country(&mut data.countries);
                } else if a == "al" {
                    add_lte_cell(&mut data.lte_cells);
                } else if a == "an" {
                    add_network(&mut data.networks);
                } else if a == "pc" {
                    print_countries(&data.countries);
                } else if a == "pl" {
                    print_lte_cells(&data.lte_cells);
                } else if a == "pn" {
                    print_networks(&data.networks);
                } else if a == "s" {
                    json::write(&data);
                } else if a == "?" {
                    println!("ac  add country");
                    println!("al  add LTE cell");
                    println!("an  add network");
                    println!("pc  print countries");
                    println!("pl  print LTE cells");
                    println!("pn  print networks");
                    println!("s   save all data");
                    println!("^D  quit");
                }
            }
            Err(ReadlineError::Interrupted) => continue,
            Err(_) => break,
        }
    }
}

fn add_country(countries: &mut Countries) {
    let mcc = match stdin::read_u16("MCC: ", None) {
        Some(a) => a,
        None => return,
    };
    let name = match stdin::read_string("Name: ", None) {
        Some(a) => a,
        None => return,
    };
    let country = Country {
        mcc: mcc,
        name: name,
    };
    countries.insert(country.mcc, country);
}

fn add_lte_cell(cells: &mut LTECells) {
    let mcc = match stdin::read_u16("MCC: ", None) {
        Some(a) => a,
        None => return,
    };
    let mnc = match stdin::read_u16("MNC: ", None) {
        Some(a) => a,
        None => return,
    };
    let id = match stdin::read_u32("CID: ", None) {
        Some(a) => a,
        None => return,
    };
    let cell = LTECell {
        mcc: mcc,
        mnc: mnc,
        id: id,
    };
    cells.insert(cell.global_id(), cell);
}

fn add_network(networks: &mut Networks) {
    let mcc = match stdin::read_u16("MCC: ", None) {
        Some(a) => a,
        None => return,
    };
    let mnc = match stdin::read_u16("MNC: ", None) {
        Some(a) => a,
        None => return,
    };
    let name = match stdin::read_string("Name: ", None) {
        Some(a) => a,
        None => return,
    };
    let network = Network {
        mcc: mcc,
        mnc: mnc,
        name: name,
    };
    networks.insert(network.id(), network);
}

fn print_countries(countries: &Countries) {
    for (_, country) in countries {
        println!("#{}: {}", country.mcc, country.name);
    }
}

fn print_lte_cells(lte_cells: &LTECells) {
    for (_, lte_cell) in lte_cells {
        println!("#{}-{}-{}", lte_cell.mcc, lte_cell.mnc, lte_cell.id);
    }
}

fn print_networks(networks: &Networks) {
    for (_, network) in networks {
        if network.mnc % 10 == 0 {
            println!("#{}-{:02}: {}", network.mcc, network.mnc / 10, network.name);
        } else {
            println!("#{}-{:03}: {}", network.mcc, network.mnc, network.name);
        }
    }
}