wireless 0.2.2

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

use rustyline::Editor;
use rustyline::error::ReadlineError;

pub fn read_string(prompt: &str, default: Option<&str>) -> Option<String> {
    let string;
    let mut editor = Editor::<()>::new();
    let prompt: &str = match default {
        Some(a) => {
            string = str::replace(prompt, "%d", a);
            string.as_ref()
        }
        None => prompt,
    };
    loop {
        match editor.readline(prompt) {
            Ok(a) => return Some(a),
            Err(ReadlineError::Eof) => return None,
            Err(ReadlineError::Interrupted) => return None,
            Err(_) => continue,
        }
    }
}

pub fn read_u16(prompt: &str, default: Option<&u16>) -> Option<u16> {
    let string;
    let default: Option<&str> = match default {
        Some(a) => {
            string = a.to_string();
            Some(&string)
        }
        None => None,
    };
    loop {
        let string = match read_string(prompt, default) {
            Some(a) => a,
            None => return None,
        };
        match string.parse::<u16>() {
            Ok(a) => return Some(a),
            Err(_) => continue,
        }
    }
}

pub fn read_u32(prompt: &str, default: Option<&u32>) -> Option<u32> {
    let string;
    let default: Option<&str> = match default {
        Some(a) => {
            string = a.to_string();
            Some(&string)
        }
        None => None,
    };
    loop {
        let string = match read_string(prompt, default) {
            Some(a) => a,
            None => return None,
        };
        match string.parse::<u32>() {
            Ok(a) => return Some(a),
            Err(_) => continue,
        }
    }
}