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,
}
}
}