term_inquiry/
lib.rs

1mod checkbox_list;
2mod list;
3mod term_data;
4
5#[cfg(windows)]
6::windows::include_bindings!();
7
8pub use checkbox_list::CheckboxList;
9pub use list::List;
10
11pub enum InquiryMessage {
12    CloseRequested,
13    FlushLockErr,
14    TermDisableRawErr,
15    TermEnableRawErr,
16}
17
18pub enum Keys {
19    A,
20    Up,
21    Down,
22    Left,
23    Right,
24    CtrlC,
25    CtrlZ,
26    Escape,
27    Enter,
28    Unhandled([u8; 4]),
29}
30
31impl From<Stdin> for Keys {
32    fn from(mut std_in: Stdin) -> Self {
33        let mut data = [0, 0, 0, 0];
34        let bytes_read = match std_in.read(&mut data) {
35            Ok(bytes) => bytes,
36            Err(error) => panic!(
37                "There was an issue when reading bytes from std input \
38                       stream. {}",
39                error
40            ),
41        };
42
43        match data[0] {
44            3 => Self::CtrlC,
45            26 => Self::CtrlZ,
46            #[cfg(windows)]
47            13 => Self::Enter,
48            #[cfg(unix)]
49            10 => Self::Enter,
50            27 => {
51                if bytes_read == 0 {
52                    return Self::Escape;
53                }
54
55                match data[1] {
56                    91 => match data[2] {
57                        65 => Self::Up,
58                        66 => Self::Down,
59                        67 => Self::Right,
60                        68 => Self::Left,
61                        _ => Self::Unhandled(data),
62                    },
63                    _ => Self::Unhandled(data),
64                }
65            }
66            97 => Self::A,
67            _ => Self::Unhandled(data),
68        }
69    }
70}
71
72use std::io::{Read, Stdin};