diff options
Diffstat (limited to 'src/hex.rs')
| -rw-r--r-- | src/hex.rs | 35 |
1 files changed, 35 insertions, 0 deletions
diff --git a/src/hex.rs b/src/hex.rs new file mode 100644 index 0000000..6dfbe7f --- /dev/null +++ b/src/hex.rs @@ -0,0 +1,35 @@ +use std::{fs, io}; +use std::io::stdout; +use ratatui::{backend::CrosstermBackend, Terminal}; +use crossterm::{execute, terminal::{disable_raw_mode, enable_raw_mode, EnterAlternateScreen, LeaveAlternateScreen}}; +use crate::{input, render}; + +pub struct HexEditor { + filename: String, + data: Vec<u8>, + cursor: usize, + terminal: Terminal<CrosstermBackend<std::io::Stdout>>, +} + +impl HexEditor { + pub fn new(filename: String, data: Vec<u8>) -> io::Result<Self> { + enable_raw_mode()?; + execute!(stdout(), EnterAlternateScreen)?; + let terminal = Terminal::new(CrosstermBackend::new(stdout()))?; + Ok(Self { filename, data, cursor: 0, terminal }) + } + + pub fn run(&mut self) -> io::Result<()> { + while input::handle_input(&mut self.cursor, &mut self.data[..])? { + render::draw(&mut self.terminal, &self.data, self.cursor, &self.filename)?; + } + self.cleanup() + } + + pub fn cleanup(&mut self) -> io::Result<()> { + disable_raw_mode()?; + execute!(stdout(), LeaveAlternateScreen)?; + fs::write(&self.filename, &self.data)?; + Ok(()) + } +} |
