-
Notifications
You must be signed in to change notification settings - Fork 2
/
multiple.rs
57 lines (53 loc) · 1.72 KB
/
multiple.rs
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
53
54
55
56
57
use crossterm::style::Stylize;
use rucline::prompt::{Builder, Prompt};
use rucline::{Buffer, Outcome};
fn main() {
// Simulate a list of acceptable inputs
let possible_commands = vec!["run", "walk", "fly"];
// Simulate a history of previous inputs
let command_history = vec!["run", "fly"];
let mode_history = vec![
"slow",
"fast",
"normal",
"very slowly almost stopping",
"very quickly almost lightspeed",
];
let mut buffer = Buffer::new();
// Initial prompt
while let Ok(Outcome::Accepted(command)) = Prompt::from(format!("{}> ", "vai".dark_green()))
.erase_after_read(true)
.buffer(buffer.clone())
.suggester_ref(&possible_commands)
.completer_ref(&command_history)
.read_line()
{
// Accept command if it exists
if possible_commands.contains(&command.as_str()) {
// Show the sub-prompt
if let Ok(outcome) = Prompt::from(format!(
"{}|{}> ",
"vai".dark_green(),
command.as_str().green()
))
.erase_after_read(true)
.completer_ref(&mode_history)
.read_line()
{
match outcome {
Outcome::Accepted(mode) => {
// We will do as commanded
println!("Ok! Will {command} {mode}");
break;
}
Outcome::Canceled(_) => {
buffer = command.into();
}
}
}
} else {
// Command not recognized
eprintln!("\n{} invalid command", "Error".red());
}
}
}