malachi 0.9.8

A domain specific pattern matching language made for defining bot commands.
Documentation
Contains matches from a text matched by a [Command][crate::Command].

Lifetime `'c` refers to the command and `'t` refers to the text that was
matched.

#### Examples
```rust
use malachi::{
    Command,
    Match,
};

// Our command will create a note with a title
// and optionally some tags.
// Tags must start with `-`.
let cmd = Command::new(
    "?note [
    <tags*: starts('-')>
    <title>
]",
)?;

// An example invocation.
let msg = "?note example This is an example note.";

let args = cmd
    .get_matches(msg)
    .ok_or("Command didn't match the message!")?;

// We get capture matches by their name.
assert_eq!(Some(&Match::Once("example")), args.get("title"),);

// We can use `get_once` to simplify it:
assert_eq!(Some("example"), args.get_once("title"),);

assert_eq!(None, args.get("tags"),);

// We can access the note body with args.rest:
assert_eq!(
    // Notice the leading space, they are kept.
    " This is an example note.",
    args.rest,
);

// This time, lets supply some tags too.
let msg = "?note take2 -example -foo Another note!";

let args = cmd
    .get_matches(msg)
    .ok_or("Command didn't match the message!")?;

assert_eq!(Some("take2"), args.get_once("title"),);

assert_eq!(Some(&vec!["example", "foo"]), args.get_many("tags"),);

assert_eq!(" Another note!", args.rest,);

# Ok::<(), Box<dyn std::error::Error>>(())
```