summaryrefslogtreecommitdiffstats
path: root/zellij-utils/src/data.rs
diff options
context:
space:
mode:
Diffstat (limited to 'zellij-utils/src/data.rs')
-rw-r--r--zellij-utils/src/data.rs82
1 files changed, 41 insertions, 41 deletions
diff --git a/zellij-utils/src/data.rs b/zellij-utils/src/data.rs
index 998392ff7..204c57e43 100644
--- a/zellij-utils/src/data.rs
+++ b/zellij-utils/src/data.rs
@@ -62,6 +62,8 @@ pub enum Key {
BackTab,
Null,
Esc,
+ AltF(u8),
+ CtrlF(u8),
}
impl FromStr for Key {
@@ -78,14 +80,7 @@ impl FromStr for Key {
}
match (modifier, main_key) {
(Some("Ctrl"), Some(main_key)) => {
- let mut key_chars = main_key.chars();
- let key_count = main_key.chars().count();
- if key_count == 1 {
- let key_char = key_chars.next().unwrap();
- Ok(Key::Ctrl(key_char))
- } else {
- Err(format!("Failed to parse key: {}", key_str).into())
- }
+ parse_main_key(main_key, key_str, Key::Ctrl, Key::CtrlF)
},
(Some("Alt"), Some(main_key)) => {
match main_key {
@@ -96,16 +91,12 @@ impl FromStr for Key {
"Right" => Ok(Key::Alt(CharOrArrow::Direction(Direction::Right))),
"Up" => Ok(Key::Alt(CharOrArrow::Direction(Direction::Up))),
"Down" => Ok(Key::Alt(CharOrArrow::Direction(Direction::Down))),
- _ => {
- let mut key_chars = main_key.chars();
- let key_count = main_key.chars().count();
- if key_count == 1 {
- let key_char = key_chars.next().unwrap();
- Ok(Key::Alt(CharOrArrow::Char(key_char)))
- } else {
- Err(format!("Failed to parse key: {}", key_str).into())
- }
- },
+ _ => parse_main_key(
+ main_key,
+ key_str,
+ |c| Key::Alt(CharOrArrow::Char(c)),
+ Key::AltF,
+ ),
}
},
(None, Some(main_key)) => match main_key {
@@ -124,35 +115,42 @@ impl FromStr for Key {
"Space" => Ok(Key::Char(' ')),
"Enter" => Ok(Key::Char('\n')),
"Esc" => Ok(Key::Esc),
- _ => {
- let mut key_chars = main_key.chars();
- let key_count = main_key.chars().count();
- if key_count == 1 {
- let key_char = key_chars.next().unwrap();
- Ok(Key::Char(key_char))
- } else if key_count > 1 {
- if let Some(first_char) = key_chars.next() {
- if first_char == 'F' {
- let f_index: String = key_chars.collect();
- let f_index: u8 = f_index
- .parse()
- .map_err(|e| format!("Failed to parse F index: {}", e))?;
- if f_index >= 1 && f_index <= 12 {
- return Ok(Key::F(f_index));
- }
- }
- }
- Err(format!("Failed to parse key: {}", key_str).into())
- } else {
- Err(format!("Failed to parse key: {}", key_str).into())
- }
- },
+ _ => parse_main_key(main_key, key_str, Key::Char, Key::F),
},
_ => Err(format!("Failed to parse key: {}", key_str).into()),
}
}
}
+fn parse_main_key(
+ main_key: &str,
+ key_str: &str,
+ to_char_key: impl FnOnce(char) -> Key,
+ to_fn_key: impl FnOnce(u8) -> Key,
+) -> Result<Key, Box<dyn std::error::Error>> {
+ let mut key_chars = main_key.chars();
+ let key_count = main_key.chars().count();
+ if key_count == 1 {
+ let key_char = key_chars.next().unwrap();
+ Ok(to_char_key(key_char))
+ } else if key_count > 1 {
+ if let Some(first_char) = key_chars.next() {
+ if first_char == 'F' {
+ let f_index: String = key_chars.collect();
+ let f_index: u8 = f_index
+ .parse()
+ .map_err(|e| format!("Failed to parse F index: {}", e))?;
+ if f_index >= 1 && f_index <= 12 {
+ return Ok(to_fn_key(f_index));
+ }
+ }
+ }
+ Err(format!("Failed to parse key: {}", key_str).into())
+ } else {
+ Err(format!("Failed to parse key: {}", key_str).into())
+ }
+}
+
impl fmt::Display for Key {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
match self {
@@ -177,6 +175,8 @@ impl fmt::Display for Key {
},
Key::Alt(c) => write!(f, "Alt+{}", c),
Key::Ctrl(c) => write!(f, "Ctrl+{}", Key::Char(*c)),
+ Key::AltF(n) => write!(f, "Alt+F{}", n),
+ Key::CtrlF(n) => write!(f, "Ctrl+F{}", n),
Key::Null => write!(f, "NULL"),
Key::Esc => write!(f, "ESC"),
}