diff options
| author | Adandi <rwindowed@gmail.com> | 2025-03-21 15:57:22 +0200 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2025-03-21 15:57:22 +0200 |
| commit | 018d4287dc2a564b2daf8d595692024b91681ea3 (patch) | |
| tree | 8a84529a6f08138d2842718b21430475dca4b46a /src/hex.rs | |
| parent | 1fcd3aa2098de576f5551af0c332665f9233eb4c (diff) | |
Add files via upload
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(()) + } +} |
