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
mod elements;
mod error;
mod state;
mod tools;

use crossterm::{
	cursor::{Hide, Show},
	event::{read, DisableMouseCapture, EnableMouseCapture, MouseEvent},
	queue,
	style::ResetColor,
	terminal::{
		disable_raw_mode, enable_raw_mode, Clear, ClearType, EnterAlternateScreen,
		LeaveAlternateScreen,
	},
};

use std::io::{Stdout, Write};

use crate::{error::Result, state::State};

pub fn run(w: &mut Stdout) -> Result<()> {
	queue!(w, EnterAlternateScreen, Hide, EnableMouseCapture)?;
	enable_raw_mode()?;

	w.flush()?;

	let mut state = State::new();

	while state.should_exit() == false {
		if state.should_clear() {
			queue!(w, Clear(ClearType::All))?;
			state.set_should_clear(false);
		}

		state.render(w)?;

		w.flush()?;

		state.handle_event(read()?)?;
	}

	queue!(
		w,
		ResetColor,
		DisableMouseCapture,
		Show,
		LeaveAlternateScreen
	)?;
	disable_raw_mode()?;

	Ok(())
}