1use tokiocli::{Action, Cli};
2
3#[tokio::main]
4async fn main() -> eyre::Result<()> {
5 let mut cli = Cli::new()?;
6 let mut exit = false;
7
8 while !exit {
9 let action = cli.getaction().await?;
10 match action {
11 Action::Command(cmd) => runcmd(cmd, &mut exit),
12 Action::AutoComplete(cmd) => autocomplete(&mut cli, cmd)?,
13 Action::NoAction => exit = true,
14 };
15 }
16
17 Ok(())
18}
19
20fn runcmd(cmd: Vec<String>, exit: &mut bool) {
21 let cmdname = cmd.get(0).unwrap();
22 match cmdname.as_str() {
23 "hello" => {
24 println!("Hello from tokiocli");
25 }
26 "upper" => upper(cmd),
27 "exit" => {
28 *exit = true;
29 }
30 "help" => help(),
31 "" => {}
32 _ => {
33 println!(
34 "Unknown command '{}'.\nType 'help' to list available commands.",
35 cmdname
36 );
37 }
38 }
39}
40
41fn autocomplete(cli: &mut Cli, cmd: Vec<String>) -> eyre::Result<()> {
42 let mut cmdlist = vec![
43 String::from("hello"),
44 String::from("upper"),
45 String::from("exit"),
46 String::from("help"),
47 ];
48
49 if cmd.len() == 1 {
50 cmdlist.retain(|x| x.starts_with(&cmd[0]));
51 cli.autocomplete(&cmdlist)?;
53 } else if cmd.len() > 1 {
54 }
56 Ok(())
57}
58
59fn upper(cmd: Vec<String>) {
60 for arg in cmd.iter().skip(1) {
61 print!("{} ", arg.to_uppercase());
62 }
63 println!("");
64}
65
66fn help() {
67 println!("Simple interactive cli example.");
68 println!("Available commands:");
69 println!(" hello: Print hello world");
70 println!(" upper: Print arguments to upper case");
71 println!(" exit: Exit this application");
72 println!(" help: Display this help");
73}