1use std::time::Duration;
2
3use crossterm::cursor::{self};
4use crossterm::event::{self, KeyCode};
5use crossterm::terminal::{disable_raw_mode, enable_raw_mode};
6use crossterm::{execute, terminal};
7use string_cmd::events::event_to_command;
8use string_cmd::StringEditor;
9
10fn main() -> std::io::Result<()> {
11 let mut editor = StringEditor::new();
12 let mut stdout = std::io::stdout();
13
14 println!("Enter text below:");
15 enable_raw_mode()?;
16
17 let input = loop {
18 if event::poll(Duration::from_millis(10))? {
19 let event = event::read()?;
20 if let event::Event::Key(key) = &event {
21 let ctrl = key.modifiers.contains(event::KeyModifiers::CONTROL);
22
23 match key.code {
24 KeyCode::Esc => break None,
25 KeyCode::Char('q') if ctrl => break None,
26 KeyCode::Enter => break Some(editor.get_text()),
27 _ => {}
28 }
29 }
30
31 if let Some(command) = event_to_command(&event) {
32 editor.execute(command);
33 }
34 }
35
36 execute!(
37 stdout,
38 cursor::MoveToColumn(0),
39 terminal::Clear(terminal::ClearType::CurrentLine)
40 )?;
41 print!("{}", editor.get_text());
42 execute!(stdout, cursor::MoveToColumn(editor.cursor_pos() as u16))?;
43 };
44
45 disable_raw_mode()?;
46 println!("\nGot input: {:?}", input);
47
48 Ok(())
49}