diff --git a/rules/en/deadline.go b/rules/en/deadline.go index 2996586..b9d0a06 100644 --- a/rules/en/deadline.go +++ b/rules/en/deadline.go @@ -11,12 +11,23 @@ import ( "github.com/pkg/errors" ) -func Deadline(s rules.Strategy) rules.Rule { +// DeadlineOptions configures the Deadline rule. +type DeadlineOptions struct { + // Aggressive makes the "in"/"within" prefix optional, so "2 hours" matches too. + Aggressive bool +} + +func Deadline(s rules.Strategy, opts ...DeadlineOptions) rules.Rule { overwrite := s == rules.Override + prefix := "(within|in)" + if len(opts) > 0 && opts[0].Aggressive { + prefix += "?" + } + return &rules.F{ RegExp: regexp.MustCompile( - "(?i)(?:\\W|^)(within|in)\\s*" + + "(?i)(?:\\W|^)" + prefix + "\\s*" + "(" + INTEGER_WORDS_PATTERN + "|[0-9]+|an?(?:\\s*few)?|half(?:\\s*an?)?)\\s*" + "(seconds?|min(?:ute)?s?|hours?|days?|weeks?|months?|years?)\\s*" + "(?:\\W|$)"), diff --git a/rules/en/deadline_test.go b/rules/en/deadline_test.go index bebb883..8fc6c5d 100644 --- a/rules/en/deadline_test.go +++ b/rules/en/deadline_test.go @@ -31,3 +31,23 @@ func TestDeadline(t *testing.T) { ApplyFixtures(t, "en.Deadline", w, fixt) } + +func TestDeadlineAggressive(t *testing.T) { + fixt := []Fixture{ + {"2 hours", 0, "2 hours", 2 * time.Hour}, + {"remind me 4 days later", 10, "4 days", 4 * 24 * time.Hour}, + {"a week", 0, "a week", 7 * 24 * time.Hour}, + {"within half an hour", 0, "within half an hour", time.Hour / 2}, + {"call me back in 5 minutes", 13, "in 5 minutes", 5 * time.Minute}, + } + + w := when.New(nil) + w.Add(en.Deadline(rules.Skip, en.DeadlineOptions{Aggressive: true})) + + ApplyFixtures(t, "en.Deadline aggressive", w, fixt) + + w = when.New(nil) + w.Add(en.Deadline(rules.Skip)) + + ApplyFixturesNil(t, "en.Deadline", w, []Fixture{{"2 hours", 0, "", 0}}) +}