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: <ECells) {
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);
}
}
}