tri 0.1.0

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

use chrono::NaiveDate;
use nom::{IResult, multispace, rest_s};

use commands::AddTask;
use nlp::{date, slack_id};
use nlp::priority::parser as priority;

impl FromStr for AddTask {
    type Err = ();

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

named!(pub parser(&str) -> AddTask, do_parse!(
    tag_s!("add")            >>
    multispace               >>
    priority: priority       >>
    multispace               >>
    tag_s!("priority")       >>
    multispace               >>
    tag_s!("task")           >>
    multispace               >>
    due_date: opt!(due_date) >>
    tag_s!("to")             >>
    multispace               >>
    user_slack_id: slack_id  >>
    multispace               >>
    name: rest_s             >>
    ( AddTask {
        due_date,
        name: name.to_string(),
        priority,
        user_slack_id: user_slack_id.to_string(),
    } )));

named!(due_date(&str) -> NaiveDate, do_parse!(
    tag_s!("due") >>
    multispace    >>
    date: date    >>
    multispace    >>
    ( date )));

#[test]
fn add_task() {
    use priority::Priority;

    assert_eq!(
        "add extreme priority task due 2001-02-03 to <@USLACKBOT> buy more snacks"
            .parse::<AddTask>()
            .unwrap(),
        AddTask {
            due_date: Some(NaiveDate::from_ymd(2001, 2, 3)),
            name: "buy more snacks".to_string(),
            priority: Priority::Extreme,
            user_slack_id: "USLACKBOT".to_string(),
        }
    );
    assert_eq!(
        "add minimal priority task to <@USLACKBOT> fix Minnehack registration"
            .parse::<AddTask>()
            .unwrap(),
        AddTask {
            due_date: None,
            name: "fix Minnehack registration".to_string(),
            priority: Priority::Minimal,
            user_slack_id: "USLACKBOT".to_string(),
        }
    );
}