dprint_cli_core/
terminal.rs

1use anyhow::Result;
2use crossterm::event::read;
3use crossterm::event::Event;
4use crossterm::event::KeyCode;
5use crossterm::event::KeyEvent;
6use crossterm::event::KeyModifiers;
7use crossterm::terminal;
8
9pub fn get_terminal_width() -> Option<u16> {
10  get_terminal_size().map(|(cols, _)| cols)
11}
12
13/// Gets the terminal size (width/cols, height/rows).
14pub fn get_terminal_size() -> Option<(u16, u16)> {
15  match crossterm::terminal::size() {
16    Ok(size) => Some(size),
17    Err(_) => None,
18  }
19}
20
21pub(crate) fn read_terminal_event() -> Result<Event> {
22  // https://github.com/crossterm-rs/crossterm/issues/521
23  terminal::enable_raw_mode()?;
24  let result = read();
25  terminal::disable_raw_mode()?;
26  match result {
27    Ok(Event::Key(KeyEvent {
28      code: KeyCode::Char('c'),
29      modifiers: KeyModifiers::CONTROL,
30    })) => Ok(Event::Key(KeyEvent {
31      code: KeyCode::Esc,
32      modifiers: KeyModifiers::NONE,
33    })),
34    _ => Ok(result?),
35  }
36}