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
67
mod box_drawing;
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(())
}