diff --git a/plan/command/add.go b/plan/command/add.go index 3f483a9..af99947 100644 --- a/plan/command/add.go +++ b/plan/command/add.go @@ -1,6 +1,7 @@ package command import ( + "errors" "fmt" "time" @@ -9,19 +10,25 @@ import ( "go-mod.ewintr.nl/planner/plan/storage" ) +var ( + ErrInvalidArg = errors.New("invalid argument") +) + var AddCmd = &cli.Command{ Name: "add", Usage: "Add a new event", Flags: []cli.Flag{ &cli.StringFlag{ - Name: "name", - Aliases: []string{"n"}, - Usage: "The event that will happen", + Name: "name", + Aliases: []string{"n"}, + Usage: "The event that will happen", + Required: true, }, &cli.StringFlag{ - Name: "on", - Aliases: []string{"o"}, - Usage: "The date, in YYYY-MM-DD format", + Name: "on", + Aliases: []string{"o"}, + Usage: "The date, in YYYY-MM-DD format", + Required: true, }, &cli.StringFlag{ Name: "at", @@ -37,29 +44,49 @@ var AddCmd = &cli.Command{ } func NewAddCmd(repo storage.EventRepo) *cli.Command { - AddCmd.Action = NewAddAction(repo) + AddCmd.Action = func(cCtx *cli.Context) error { + return Add(cCtx.String("name"), cCtx.String("on"), cCtx.String("at"), cCtx.String("for"), repo) + } return AddCmd } -func NewAddAction(repo storage.EventRepo) func(*cli.Context) error { - return func(cCtx *cli.Context) error { - desc := cCtx.String("name") - date, err := time.Parse("2006-01-02", cCtx.String("date")) - if err != nil { - return fmt.Errorf("could not parse date: %v", err) - } - - one := item.Event{ - ID: "a", - EventBody: item.EventBody{ - Title: desc, - Start: date, - }, - } - if err := repo.Store(one); err != nil { - return fmt.Errorf("could not store event: %v", err) - } - - return nil +func Add(nameStr, onStr, atStr, frStr string, repo storage.EventRepo) error { + if nameStr == "" { + return fmt.Errorf("%w: name is required", ErrInvalidArg) } + if onStr == "" { + return fmt.Errorf("%w: date is required", ErrInvalidArg) + } + + startFormat := "2006-01-02" + startStr := onStr + if atStr != "" { + startFormat = fmt.Sprintf("%s HH:MM", startFormat) + startStr = fmt.Sprintf("%s %s", startStr, atStr) + } + start, err := time.Parse(startFormat, startStr) + if err != nil { + return fmt.Errorf("%w: could not parse start time and date: %v", ErrInvalidArg, err) + } + + e := item.Event{ + ID: "a", + EventBody: item.EventBody{ + Title: nameStr, + Start: start, + }, + } + + if frStr != "" { + fr, err := time.ParseDuration(frStr) + if err != nil { + return fmt.Errorf("%w: could not parse time: %s", ErrInvalidArg, err) + } + e.Duration = fr + } + if err := repo.Store(e); err != nil { + return fmt.Errorf("could not store event: %v", err) + } + + return nil } diff --git a/plan/command/add_test.go b/plan/command/add_test.go new file mode 100644 index 0000000..d67ee54 --- /dev/null +++ b/plan/command/add_test.go @@ -0,0 +1,10 @@ +package command_test + +func TestAdd(t *testing.T) { + t.Parallel() + + for _, tc := range []struct{ + name string + + } +}