tri 0.1.0

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

use nom::{digit, IResult, multispace};

use commands::ChangeDueDate;
use nlp::date;

impl FromStr for ChangeDueDate {
    type Err = ();

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

named!(pub parser(&str) -> ChangeDueDate, alt_complete!(set | unset));

named!(set(&str) -> ChangeDueDate, do_parse!(
    tag_s!("set")                      >>
    multispace                         >>
    tag_s!("due")                      >>
    multispace                         >>
    tag_s!("date")                     >>
    multispace                         >>
    for_from                           >>
    multispace                         >>
    id: map_res!(digit, i32::from_str) >>
    multispace                         >>
    tag_s!("to")                       >>
    multispace                         >>
    date: date                         >>
    ( ChangeDueDate(id, Some(date)) )));

named!(unset(&str) -> ChangeDueDate, do_parse!(
    tag_s!("remove")                   >>
    multispace                         >>
    tag_s!("due")                      >>
    multispace                         >>
    tag_s!("date")                     >>
    multispace                         >>
    for_from                           >>
    multispace                         >>
    id: map_res!(digit, i32::from_str) >>
    ( ChangeDueDate(id, None) )));

named!(for_from(&str) -> &str, alt_complete!(
    tag_s!("for") |
    tag_s!("from")));

#[test]
fn change_due_date() {
    use chrono::NaiveDate;

    assert_eq!(
        "set due date for 1 to 2001-02-03"
            .parse::<ChangeDueDate>()
            .unwrap(),
        ChangeDueDate(1, Some(NaiveDate::from_ymd(2001, 2, 3)))
    );
    assert_eq!(
        "remove due date from 2".parse::<ChangeDueDate>().unwrap(),
        ChangeDueDate(2, None)
    );
}