some new stuff
This commit is contained in:
+83
@@ -0,0 +1,83 @@
|
||||
use std::io::{self, Read};
|
||||
|
||||
#[derive(Debug, Clone, PartialEq)]
|
||||
pub enum KeyKind {
|
||||
Enter,
|
||||
Escape,
|
||||
Up,
|
||||
Down,
|
||||
Left,
|
||||
Right,
|
||||
Char(String),
|
||||
}
|
||||
|
||||
#[derive(Debug, Clone)]
|
||||
pub struct Key {
|
||||
pub kind: KeyKind,
|
||||
pub raw: String,
|
||||
pub ctrl: bool,
|
||||
pub shift: bool,
|
||||
}
|
||||
|
||||
impl Key {
|
||||
pub fn new(k: String) -> Key {
|
||||
let mut ctrl = false;
|
||||
let mut shift = false;
|
||||
let kind = match k.as_str() {
|
||||
"\r" => KeyKind::Enter,
|
||||
"\x1b" => KeyKind::Escape,
|
||||
"\x1b[A" => KeyKind::Up,
|
||||
"\x1b[B" => KeyKind::Down,
|
||||
"\x1b[C" => KeyKind::Right,
|
||||
"\x1b[D" => KeyKind::Left,
|
||||
|
||||
// Ctrl keys
|
||||
"\u{17}" => {
|
||||
ctrl = true;
|
||||
KeyKind::Char("w".to_string())
|
||||
}
|
||||
|
||||
"\u{13}" => {
|
||||
ctrl = true;
|
||||
KeyKind::Char("s".to_string())
|
||||
}
|
||||
|
||||
"\u{1}" => {
|
||||
ctrl = true;
|
||||
KeyKind::Char("a".to_string())
|
||||
}
|
||||
|
||||
"\u{4}" => {
|
||||
ctrl = true;
|
||||
KeyKind::Char("d".to_string())
|
||||
}
|
||||
|
||||
"\u{11}" => {
|
||||
ctrl = true;
|
||||
KeyKind::Char("q".to_string())
|
||||
}
|
||||
|
||||
_ => {
|
||||
shift = k.to_uppercase() == k;
|
||||
KeyKind::Char(k.clone())
|
||||
}
|
||||
};
|
||||
Key {
|
||||
raw: k,
|
||||
kind,
|
||||
ctrl,
|
||||
shift,
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
pub fn read_key() -> Key {
|
||||
let mut buffer = vec![0; 3];
|
||||
io::stdin().read(&mut buffer).unwrap();
|
||||
Key::new(
|
||||
String::from_utf8(buffer)
|
||||
.unwrap()
|
||||
.trim_matches('\0')
|
||||
.to_string(),
|
||||
)
|
||||
}
|
||||
Reference in New Issue
Block a user