summaryrefslogtreecommitdiff
path: root/src/input.rs
diff options
context:
space:
mode:
Diffstat (limited to 'src/input.rs')
-rw-r--r--src/input.rs23
1 files changed, 23 insertions, 0 deletions
diff --git a/src/input.rs b/src/input.rs
new file mode 100644
index 0000000..0db7e16
--- /dev/null
+++ b/src/input.rs
@@ -0,0 +1,23 @@
+use std::{io, time::Duration};
+use crossterm::{event::{self, KeyCode, KeyEvent}};
+
+pub fn handle_input(cursor: &mut usize, data: &mut [u8]) -> io::Result<bool> {
+ if event::poll(Duration::from_millis(100))? {
+ if let event::Event::Key(KeyEvent { code, .. }) = event::read()? {
+ match code {
+ KeyCode::Esc => return Ok(false),
+ KeyCode::Left if *cursor > 0 => *cursor -= 1,
+ KeyCode::Right if *cursor < data.len() * 2 - 1 => *cursor += 1,
+ KeyCode::Up if *cursor >= 32 => *cursor -= 32,
+ KeyCode::Down if *cursor + 32 < data.len() * 2 => *cursor += 32,
+ KeyCode::Char(c) if c.is_ascii_hexdigit() => {
+ let byte_index = *cursor / 2;
+ let shift = if *cursor % 2 == 0 { 4 } else { 0 };
+ data[byte_index] = (data[byte_index] & (0x0F << (4 - shift))) | (c.to_digit(16).unwrap() as u8) << shift;
+ }
+ _ => {}
+ }
+ }
+ }
+ Ok(true)
+}