From 86612e49988f496561c85924abfdc3848e3098e7 Mon Sep 17 00:00:00 2001 From: Erik Winter Date: Mon, 17 Oct 2022 10:20:18 +0200 Subject: [PATCH] add recur to cli --- cmd/cli/command/command.go | 25 +++++++++++++++++++++++++ cmd/cli/command/command_test.go | 16 ++++++++++++++++ cmd/cli/command/folder.go | 2 +- internal/task/recur.go | 5 ++++- 4 files changed, 46 insertions(+), 2 deletions(-) diff --git a/cmd/cli/command/command.go b/cmd/cli/command/command.go index 05b76a5..7307839 100644 --- a/cmd/cli/command/command.go +++ b/cmd/cli/command/command.go @@ -18,6 +18,7 @@ var ( ErrFieldAlreadyUsed = errors.New("field was already used") ErrInvalidDate = errors.New("could not understand date format") ErrInvalidProject = errors.New("could not understand project") + ErrInvalidRecur = errors.New("could not understand recurrer") ) type Command interface { @@ -124,6 +125,18 @@ func ParseTaskFieldArgs(args []string) (*task.LocalUpdate, error) { fields = append(fields, task.FIELD_DUE) continue } + if recur, ok := parseRecurField(f); ok { + fmt.Printf("%+v\n", recur) + if recur == nil { + return &task.LocalUpdate{}, ErrInvalidRecur + } + if lu.Recur != nil { + return &task.LocalUpdate{}, fmt.Errorf("%w: %v", ErrFieldAlreadyUsed, task.FIELD_RECUR) + } + lu.Recur = recur + fields = append(fields, task.FIELD_RECUR) + continue + } if len(f) > 0 { action = append(action, f) } @@ -158,3 +171,15 @@ func parseDueField(s string) (task.Date, bool) { return due, true } + +func parseRecurField(s string) (task.Recurrer, bool) { + if !strings.HasPrefix(s, "recur:") && !strings.HasPrefix(s, "r:") { + return nil, false + } + split := strings.SplitN(s, ":", 2) + fmt.Printf("s: %+v\n", split[1]) + + recur := task.NewRecurrer(split[1]) + + return recur, true +} diff --git a/cmd/cli/command/command_test.go b/cmd/cli/command/command_test.go index 9f5e0ea..1f3d583 100644 --- a/cmd/cli/command/command_test.go +++ b/cmd/cli/command/command_test.go @@ -90,6 +90,22 @@ func TestParseTaskFieldArgs(t *testing.T) { expUpdate: &task.LocalUpdate{}, expErr: command.ErrInvalidDate, }, + { + name: "recur", + input: "recur:today,daily", + expUpdate: &task.LocalUpdate{ + Fields: []string{task.FIELD_RECUR}, + Recur: task.NewRecurrer("today, daily"), + }, + }, + { + name: "recurs short", + input: "r:today,daily", + expUpdate: &task.LocalUpdate{ + Fields: []string{task.FIELD_RECUR}, + Recur: task.NewRecurrer("today, daily"), + }, + }, } { t.Run(tc.name, func(t *testing.T) { args := strings.Split(tc.input, " ") diff --git a/cmd/cli/command/folder.go b/cmd/cli/command/folder.go index 9a5f988..61ab8bc 100644 --- a/cmd/cli/command/folder.go +++ b/cmd/cli/command/folder.go @@ -23,7 +23,7 @@ func NewFolder(conf *configuration.Configuration, cmdArgs []string) (*Folder, er if len(cmdArgs) < 1 { return &Folder{}, ErrInvalidAmountOfArgs } - knownFolders := []string{task.FOLDER_NEW, task.FOLDER_PLANNED, task.FOLDER_UNPLANNED} + knownFolders := []string{task.FOLDER_NEW, task.FOLDER_RECURRING, task.FOLDER_PLANNED, task.FOLDER_UNPLANNED} var folder string for _, f := range knownFolders { if strings.ToLower(f) == strings.ToLower(cmdArgs[0]) { diff --git a/internal/task/recur.go b/internal/task/recur.go index 2407dbd..7dd5da2 100644 --- a/internal/task/recur.go +++ b/internal/task/recur.go @@ -13,7 +13,7 @@ type Recurrer interface { } func NewRecurrer(recurStr string) Recurrer { - terms := strings.Split(recurStr, ", ") + terms := strings.Split(recurStr, ",") if len(terms) < 2 { return nil } @@ -24,6 +24,9 @@ func NewRecurrer(recurStr string) Recurrer { } terms = terms[1:] + for i, t := range terms { + terms[i] = strings.TrimSpace(t) + } for _, parseFunc := range []func(Date, []string) (Recurrer, bool){ ParseDaily, ParseEveryNDays, ParseWeekly, ParseBiweekly,