diff options
author | Matthias Beyer <mail@beyermatthias.de> | 2018-03-22 15:01:46 +0100 |
---|---|---|
committer | GitHub <noreply@github.com> | 2018-03-22 15:01:46 +0100 |
commit | ca65c7cae2279200980050e007dc75662a0f7792 (patch) | |
tree | f04dd5cca7e02ab348647d8f201e8113e734e002 | |
parent | fe7935a94b1c0e73ea9926803bf9780c86ac2c67 (diff) | |
parent | 9e58772a1d028793dede568163e4ea58ce92eb32 (diff) |
Merge pull request #19 from matthiasbeyer/unit-aliases
Add aliases for 1second -> secondly
-rw-r--r-- | src/parser/timetype.rs | 65 |
1 files changed, 61 insertions, 4 deletions
diff --git a/src/parser/timetype.rs b/src/parser/timetype.rs index bdd7eba..83516fe 100644 --- a/src/parser/timetype.rs +++ b/src/parser/timetype.rs @@ -59,6 +59,31 @@ pub enum Unit { Year, } +#[derive(Debug, PartialEq, Eq)] +pub enum UnitAlias { + Secondly, + Minutely, + Hourly, + Daily, + Weekly, + Monthly, + Yearly, +} + +impl Into<Unit> for UnitAlias { + fn into(self) -> Unit { + match self { + UnitAlias::Secondly => Unit::Second, + UnitAlias::Minutely => Unit::Minute, + UnitAlias::Hourly => Unit::Hour, + UnitAlias::Daily => Unit::Day, + UnitAlias::Weekly => Unit::Week, + UnitAlias::Monthly => Unit::Month, + UnitAlias::Yearly => Unit::Year, + } + } +} + named!(pub operator_parser<Operator>, alt!( tag!("+") => { |_| Operator::Plus } | tag!("-") => { |_| Operator::Minus } @@ -70,10 +95,19 @@ pub enum Operator { Minus, } -named!(pub amount_parser<Amount>, do_parse!( - number: integer >> - unit : unit_parser >> - (Amount(number, unit)) +named!(pub unit_alias<UnitAlias>, alt_complete!( + tag!("secondly") => { |_| UnitAlias::Secondly } | + tag!("minutely") => { |_| UnitAlias::Minutely } | + tag!("hourly") => { |_| UnitAlias::Hourly } | + tag!("daily") => { |_| UnitAlias::Daily } | + tag!("weekly") => { |_| UnitAlias::Weekly } | + tag!("monthly") => { |_| UnitAlias::Monthly } | + tag!("yearly") => { |_| UnitAlias::Yearly } +)); + +named!(pub amount_parser<Amount>, alt!( + do_parse!(number: integer >> unit: unit_parser >> (Amount(number, unit))) | + do_parse!(unitalias: unit_alias >> (Amount(1, unitalias.into()))) )); #[derive(Debug, PartialEq, Eq)] @@ -311,6 +345,17 @@ mod tests { } #[test] + fn test_unit_alias() { + assert_eq!(unit_alias(&b"secondly"[..]), IResult::Done(&b""[..], UnitAlias::Secondly)); + assert_eq!(unit_alias(&b"minutely"[..]), IResult::Done(&b""[..], UnitAlias::Minutely)); + assert_eq!(unit_alias(&b"hourly"[..]), IResult::Done(&b""[..], UnitAlias::Hourly)); + assert_eq!(unit_alias(&b"daily"[..]), IResult::Done(&b""[..], UnitAlias::Daily)); + assert_eq!(unit_alias(&b"weekly"[..]), IResult::Done(&b""[..], UnitAlias::Weekly)); + assert_eq!(unit_alias(&b"monthly"[..]), IResult::Done(&b""[..], UnitAlias::Monthly)); + assert_eq!(unit_alias(&b"yearly"[..]), IResult::Done(&b""[..], UnitAlias::Yearly)); + } + + #[test] fn test_operator() { assert_eq!(operator_parser(&b"+"[..]), IResult::Done(&b""[..], Operator::Plus)); assert_eq!(operator_parser(&b"-"[..]), IResult::Done(&b""[..], Operator::Minus)); @@ -326,6 +371,18 @@ mod tests { } #[test] + fn test_unit_alias_with_amount_parser() { + assert_eq!(amount_parser(&b"secondly"[..]), IResult::Done(&b""[..], Amount(1, Unit::Second))); + assert_eq!(amount_parser(&b"minutely"[..]), IResult::Done(&b""[..], Amount(1, Unit::Minute))); + assert_eq!(amount_parser(&b"hourly"[..]), IResult::Done(&b""[..], Amount(1, Unit::Hour))); + assert_eq!(amount_parser(&b"daily"[..]), IResult::Done(&b""[..], Amount(1, Unit::Day))); + assert_eq!(amount_parser(&b"weekly"[..]), IResult::Done(&b""[..], Amount(1, Unit::Week))); + assert_eq!(amount_parser(&b"monthly"[..]), IResult::Done(&b""[..], Amount(1, Unit::Month))); + assert_eq!(amount_parser(&b"yearly"[..]), IResult::Done(&b""[..], Amount(1, Unit::Year))); + } + + + #[test] fn test_amountexpr_next() { assert_eq!(amount_expr_next(&b"+ 12minutes"[..]), IResult::Done(&b""[..], |