hello/
hello.rs

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        // autocomplete command
52        cli.autocomplete(&cmdlist)?;
53    } else if cmd.len() > 1 {
54        // autocomplete arguments
55    }
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}