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};