15 releases (breaking)

0.10.1 Jul 14, 2020
0.10.0 Aug 26, 2019
0.9.0 Jun 12, 2019
0.4.1 Mar 23, 2019

#767 in Data structures


Used in papyrus

MIT license

52KB
998 lines

Build Status Latest Version Rust Documentation codecov

(Rust) commands tree.

See the rs docs. Look at progress and contribute on github.

cmdtree

Create a tree-like data structure of commands and actions to add an intuitive and interactive experience to an application. cmdtree uses a builder pattern to make constructing the tree ergonomic.

Example

extern crate cmdtree;
use cmdtree::*;

fn main() {
  let cmder = Builder::default_config("cmdtree-example")
    .begin_class("class1", "class1 help message") // a class
    .begin_class("inner-class1", "nested class!") // can nest a class
    .add_action("name", "print class name", |mut wtr, _args| {
      writeln!(wtr, "inner-class1",).unwrap()
    })
    .end_class()
    .end_class() // closes out the classes
    .begin_class("print", "pertains to printing stuff") // start another class sibling to `class1`
    .add_action("echo", "repeat stuff", |mut wtr, args| {
      writeln!(wtr, "{}", args.join(" ")).unwrap()
    })
    .add_action("countdown", "countdown from a number", |mut wtr, args| {
      if args.len() != 1 {
        println!("need one number",);
      } else {
        match str::parse::<u32>(args[0]) {
          Ok(n) => {
            for i in (0..=n).rev() {
              writeln!(wtr, "{}", i).unwrap();
            }
          }
          Err(_) => writeln!(wtr, "expecting a number!",).unwrap(),
        }
      }
    })
    .into_commander() // can short-circuit the closing out of classes
    .unwrap();

  cmder.run(); // run interactively
}

Now run and in your shell:

cmdtree-example=> help            <-- Will print help messages
help -- prints the help messages
cancel | c -- returns to the root class
exit -- sends the exit signal to end the interactive loop
Classes:
        class1 -- class1 help message
        print -- pertains to printing stuff
cmdtree-example=> print            <-- Can navigate the tree
cmdtree-example.print=> help
help -- prints the help messages
cancel | c -- returns to the root class
exit -- sends the exit signal to end the interactive loop
Actions:
        echo -- repeat stuff
        countdown -- countdown from a number
cmdtree-example.print=> echo hello, world!  <-- Call the actions
hello, world!
cmdtree-example.print=> countdown
need one number
cmdtree-example.print=> countdown 10
10
9
8
7
6
5
4
3
2
1
0
cmdtree-example.print=> exit      <-- exit the loop!

Dependencies

~0–11MB
~67K SLoC