1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66
mod buffer; mod elements; mod error; mod state; mod tools; use crossterm::{ cursor::{Hide, Show}, event::{read, DisableMouseCapture, EnableMouseCapture}, queue, style::ResetColor, terminal::{ disable_raw_mode, enable_raw_mode, Clear, ClearType, EnterAlternateScreen, LeaveAlternateScreen, }, }; use std::{ env::args, io::{Stdout, Write}, path::PathBuf, }; use crate::{buffer::Buffer, error::Result, state::State}; const DEFAULT_FILE_NAME: &str = "output.txt"; pub fn run(w: &mut Stdout) -> Result<()> { let args = args().collect::<Vec<_>>(); let (file_name, load) = args .get(1) .map(|path| (PathBuf::from(path), true)) .unwrap_or((PathBuf::from(DEFAULT_FILE_NAME), false)); queue!(w, EnterAlternateScreen, Hide, EnableMouseCapture)?; enable_raw_mode()?; w.flush()?; let mut state = State::new(file_name, load)?; let mut buffer = Buffer::new(); while state.should_exit() == false { if state.should_clear() { queue!(w, Clear(ClearType::All))?; state.set_should_clear(false); } state.render(w, &mut buffer)?; w.flush()?; state.handle_event(read()?)?; } queue!( w, ResetColor, DisableMouseCapture, Show, LeaveAlternateScreen )?; disable_raw_mode()?; Ok(()) }