tri 0.1.0

A simple task bot for Slack.
use std::str::FromStr;

use nom::{IResult, multispace};

use commands::List;

impl FromStr for List {
    type Err = ();

    fn from_str(s: &str) -> Result<List, ()> {
        println!("{} -> {:?}", s, parser(s));
        match parser(s) {
            IResult::Done("", p) => Ok(p),
            IResult::Done(_, _) |
            IResult::Incomplete(_) |
            IResult::Error(_) => Err(()),
        }
    }
}

named!(pub parser(&str) -> List, complete!(alt_complete!(
    do_parse!(
        tag_s!("list")         >>
        multispace             >>
        l: qualifier           >>
        opt!(complete!(tasks)) >>
        ( l )) |
    value!(List::Me, tag_s!("list")))));

named!(qualifier(&str) -> List, alt!(
    value!(List::All,       tag_s!("all"))     |
    value!(List::Everybody, tag_s!("current")) |
    value!(List::Me,        tag_s!("my"))      |
    every_qualifier));

named!(every_qualifier(&str) -> List, do_parse!(
    tag_s!("every")                                 >>
    alt_complete!(tag_s!("body") | tag_s!("one"))   >>
    opt!(alt_complete!(tag_s!("s") | tag_s!("'s"))) >>
    ( List::Everybody )));

named!(tasks(&str) -> &str, recognize!(tuple!(multispace, tag_s!("task"), opt!(tag_s!("s")))));

#[test]
fn list() {
    assert_eq!("list".parse::<List>().unwrap(), List::Me);
    assert_eq!("list all".parse::<List>().unwrap(), List::All);
    assert_eq!("list all tasks".parse::<List>().unwrap(), List::All);
    assert_eq!("list current".parse::<List>().unwrap(), List::Everybody);
    assert_eq!(
        "list current tasks".parse::<List>().unwrap(),
        List::Everybody
    );
    assert_eq!("list everybodys".parse::<List>().unwrap(), List::Everybody);
    assert_eq!(
        "list everybodys tasks".parse::<List>().unwrap(),
        List::Everybody
    );
    assert_eq!("list everybody's".parse::<List>().unwrap(), List::Everybody);
    assert_eq!(
        "list everybody's tasks".parse::<List>().unwrap(),
        List::Everybody
    );
    assert_eq!("list everyone".parse::<List>().unwrap(), List::Everybody);
    assert_eq!(
        "list everyones tasks".parse::<List>().unwrap(),
        List::Everybody
    );
    assert_eq!("list everyone's".parse::<List>().unwrap(), List::Everybody);
    assert_eq!(
        "list everyone's tasks".parse::<List>().unwrap(),
        List::Everybody
    );
    assert_eq!("list my".parse::<List>().unwrap(), List::Me);
    assert_eq!("list my tasks".parse::<List>().unwrap(), List::Me);
}