This commit is contained in:
Erik Winter 2024-12-30 09:37:53 +01:00
parent 7415832014
commit 2a8eaf4075
12 changed files with 133 additions and 62 deletions

View File

@ -91,12 +91,6 @@ func (t Task) Valid() bool {
if t.Title == "" {
return false
}
if t.Date.IsZero() {
return false
}
if t.Duration.Seconds() < 1 {
return false
}
return true
}

View File

@ -11,16 +11,16 @@ import (
type AddArgs struct {
fieldTPL map[string][]string
task item.Task
Task item.Task
}
func NewAddArgs() AddArgs {
return AddArgs{
fieldTPL: map[string][]string{
"date": []string{"d", "date", "on"},
"time": []string{"t", "time", "at"},
"duration": []string{"dur", "duration", "for"},
"recurrer": []string{"rec", "recurrer"},
"date": {"d", "date", "on"},
"time": {"t", "time", "at"},
"duration": {"dur", "duration", "for"},
"recurrer": {"rec", "recurrer"},
},
}
}
@ -76,18 +76,18 @@ func (aa AddArgs) Parse(main []string, fields map[string]string) (Command, error
}
return &Add{
args: AddArgs{
task: tsk,
Args: AddArgs{
Task: tsk,
},
}, nil
}
type Add struct {
args AddArgs
Args AddArgs
}
func (a *Add) Do(deps Dependencies) ([][]string, error) {
if err := deps.TaskRepo.Store(a.args.task); err != nil {
func (a *Add) Do(deps Dependencies) (CommandResult, error) {
if err := deps.TaskRepo.Store(a.Args.Task); err != nil {
return nil, fmt.Errorf("could not store event: %v", err)
}
@ -95,11 +95,11 @@ func (a *Add) Do(deps Dependencies) ([][]string, error) {
if err != nil {
return nil, fmt.Errorf("could not create next local id: %v", err)
}
if err := deps.LocalIDRepo.Store(a.args.task.ID, localID); err != nil {
if err := deps.LocalIDRepo.Store(a.Args.Task.ID, localID); err != nil {
return nil, fmt.Errorf("could not store local id: %v", err)
}
it, err := a.args.task.Item()
it, err := a.Args.Task.Item()
if err != nil {
return nil, fmt.Errorf("could not convert event to sync item: %v", err)
}
@ -109,3 +109,10 @@ func (a *Add) Do(deps Dependencies) ([][]string, error) {
return nil, nil
}
type AddRender struct {
}
func (ar AddRender) Render() string {
return "stored task"
}

View File

@ -57,9 +57,12 @@ func TestAdd(t *testing.T) {
},
} {
t.Run(tc.name, func(t *testing.T) {
// setup
taskRepo := memory.NewTask()
localIDRepo := memory.NewLocalID()
syncRepo := memory.NewSync()
// parse
cmd, actParseErr := command.NewAddArgs().Parse(tc.main, tc.fields)
if tc.expErr != (actParseErr != nil) {
t.Errorf("exp %v, got %v", tc.expErr, actParseErr)
@ -67,6 +70,8 @@ func TestAdd(t *testing.T) {
if tc.expErr {
return
}
// do
if _, err := cmd.Do(command.Dependencies{
TaskRepo: taskRepo,
LocalIDRepo: localIDRepo,
@ -75,6 +80,7 @@ func TestAdd(t *testing.T) {
t.Errorf("exp nil, got %v", err)
}
// check
actTasks, err := taskRepo.FindMany(storage.TaskListParams{})
if err != nil {
t.Errorf("exp nil, got %v", err)

View File

@ -6,7 +6,6 @@ import (
"slices"
"strings"
"go-mod.ewintr.nl/planner/plan/format"
"go-mod.ewintr.nl/planner/plan/storage"
"go-mod.ewintr.nl/planner/sync/client"
)
@ -33,7 +32,11 @@ type CommandArgs interface {
}
type Command interface {
Do(deps Dependencies) ([][]string, error)
Do(deps Dependencies) (CommandResult, error)
}
type CommandResult interface {
Render() string
}
type CLI struct {
@ -63,18 +66,12 @@ func (cli *CLI) Run(args []string) error {
return err
}
data, err := cmd.Do(cli.deps)
result, err := cmd.Do(cli.deps)
if err != nil {
return err
}
fmt.Println(result.Render())
switch {
case len(data) == 0:
case len(data) == 1 && len(data[0]) == 1:
fmt.Println(data[0][0])
default:
fmt.Printf("\n%s\n", format.Table(data))
}
return nil
}

View File

@ -24,24 +24,24 @@ func (da DeleteArgs) Parse(main []string, flags map[string]string) (Command, err
}
return &Delete{
args: DeleteArgs{
Args: DeleteArgs{
LocalID: localID,
},
}, nil
}
type Delete struct {
args DeleteArgs
Args DeleteArgs
}
func (del *Delete) Do(deps Dependencies) ([][]string, error) {
func (del *Delete) Do(deps Dependencies) (CommandResult, error) {
var id string
idMap, err := deps.LocalIDRepo.FindAll()
if err != nil {
return nil, fmt.Errorf("could not get local ids: %v", err)
}
for tskID, lid := range idMap {
if del.args.LocalID == lid {
if del.Args.LocalID == lid {
id = tskID
}
}
@ -73,3 +73,9 @@ func (del *Delete) Do(deps Dependencies) ([][]string, error) {
return nil, nil
}
type DeleteResult struct{}
func (dr DeleteResult) Render() string {
return "task deleted"
}

View File

@ -44,6 +44,7 @@ func TestDelete(t *testing.T) {
},
} {
t.Run(tc.name, func(t *testing.T) {
// setup
taskRepo := memory.NewTask()
syncRepo := memory.NewSync()
if err := taskRepo.Store(e); err != nil {
@ -54,6 +55,7 @@ func TestDelete(t *testing.T) {
t.Errorf("exp nil, got %v", err)
}
// parse
cmd, actParseErr := command.NewDeleteArgs().Parse(tc.main, tc.flags)
if tc.expParseErr != (actParseErr != nil) {
t.Errorf("exp %v, got %v", tc.expParseErr, actParseErr)
@ -61,6 +63,8 @@ func TestDelete(t *testing.T) {
if tc.expParseErr {
return
}
// do
_, actDoErr := cmd.Do(command.Dependencies{
TaskRepo: taskRepo,
LocalIDRepo: localIDRepo,
@ -73,6 +77,7 @@ func TestDelete(t *testing.T) {
return
}
// check
_, repoErr := taskRepo.FindOne(e.ID)
if !errors.Is(repoErr, storage.ErrNotFound) {
t.Errorf("exp %v, got %v", storage.ErrNotFound, repoErr)

View File

@ -6,6 +6,7 @@ import (
"time"
"go-mod.ewintr.nl/planner/item"
"go-mod.ewintr.nl/planner/plan/format"
"go-mod.ewintr.nl/planner/plan/storage"
)
@ -68,7 +69,7 @@ type List struct {
args ListArgs
}
func (list *List) Do(deps Dependencies) ([][]string, error) {
func (list *List) Do(deps Dependencies) (CommandResult, error) {
localIDs, err := deps.LocalIDRepo.FindAll()
if err != nil {
return nil, fmt.Errorf("could not get local ids: %v", err)
@ -77,14 +78,37 @@ func (list *List) Do(deps Dependencies) ([][]string, error) {
if err != nil {
return nil, err
}
data := [][]string{{"id", "date", "dur", "title"}}
for _, e := range all {
lid, ok := localIDs[e.ID]
res := make([]TaskWithLID, 0, len(all))
for _, tsk := range all {
lid, ok := localIDs[tsk.ID]
if !ok {
return nil, fmt.Errorf("could not find local id for %s", e.ID)
return nil, fmt.Errorf("could not find local id for %s", tsk.ID)
}
data = append(data, []string{fmt.Sprintf("%d", lid), e.Date.String(), e.Duration.String(), e.Title})
res = append(res, TaskWithLID{
LocalID: lid,
Task: tsk,
})
}
return ListResult{
Tasks: res,
}, nil
}
type TaskWithLID struct {
LocalID int
Task item.Task
}
type ListResult struct {
Tasks []TaskWithLID
}
func (lr ListResult) Render() string {
data := [][]string{{"id", "date", "dur", "title"}}
for _, tl := range lr.Tasks {
data = append(data, []string{fmt.Sprintf("%d", tl.LocalID), tl.Task.Date.String(), tl.Task.Duration.String(), tl.Task.Title})
}
return data, nil
return fmt.Sprintf("\n%s\n", format.Table(data))
}

View File

@ -5,6 +5,8 @@ import (
"fmt"
"strconv"
"go-mod.ewintr.nl/planner/item"
"go-mod.ewintr.nl/planner/plan/format"
"go-mod.ewintr.nl/planner/plan/storage"
)
@ -36,7 +38,7 @@ type Show struct {
args ShowArgs
}
func (s *Show) Do(deps Dependencies) ([][]string, error) {
func (s *Show) Do(deps Dependencies) (CommandResult, error) {
id, err := deps.LocalIDRepo.FindOne(s.args.localID)
switch {
case errors.Is(err, storage.ErrNotFound):
@ -50,19 +52,32 @@ func (s *Show) Do(deps Dependencies) ([][]string, error) {
return nil, fmt.Errorf("could not find task")
}
return ShowResult{
LocalID: s.args.localID,
Task: tsk,
}, nil
}
type ShowResult struct {
LocalID int
Task item.Task
}
func (sr ShowResult) Render() string {
var recurStr string
if tsk.Recurrer != nil {
recurStr = tsk.Recurrer.String()
if sr.Task.Recurrer != nil {
recurStr = sr.Task.Recurrer.String()
}
data := [][]string{
{"title", tsk.Title},
{"local id", fmt.Sprintf("%d", s.args.localID)},
{"date", tsk.Date.String()},
{"time", tsk.Time.String()},
{"duration", tsk.Duration.String()},
{"title", sr.Task.Title},
{"local id", fmt.Sprintf("%d", sr.LocalID)},
{"date", sr.Task.Date.String()},
{"time", sr.Task.Time.String()},
{"duration", sr.Task.Duration.String()},
{"recur", recurStr},
// {"id", tsk.ID},
// {"id", s.Task.ID},
}
return data, nil
return fmt.Sprintf("\n%s\n", format.Table(data))
}

View File

@ -4,7 +4,6 @@ import (
"fmt"
"testing"
"github.com/google/go-cmp/cmp"
"go-mod.ewintr.nl/planner/item"
"go-mod.ewintr.nl/planner/plan/command"
"go-mod.ewintr.nl/planner/plan/storage/memory"
@ -60,6 +59,7 @@ func TestShow(t *testing.T) {
},
} {
t.Run(tc.name, func(t *testing.T) {
// parse
cmd, actParseErr := command.NewShowArgs().Parse(tc.main, nil)
if tc.expParseErr != (actParseErr != nil) {
t.Errorf("exp %v, got %v", tc.expParseErr, actParseErr != nil)
@ -67,7 +67,9 @@ func TestShow(t *testing.T) {
if tc.expParseErr {
return
}
actData, actDoErr := cmd.Do(command.Dependencies{
// do
_, actDoErr := cmd.Do(command.Dependencies{
TaskRepo: taskRepo,
LocalIDRepo: localRepo,
})
@ -77,9 +79,9 @@ func TestShow(t *testing.T) {
if tc.expDoErr {
return
}
if diff := cmp.Diff(tc.expData, actData); diff != "" {
t.Errorf("(+exp, -got)%s\n", diff)
}
// if diff := cmp.Diff(tc.expData, actData); diff != "" {
// t.Errorf("(+exp, -got)%s\n", diff)
// }
})
}

View File

@ -25,7 +25,7 @@ func (sa SyncArgs) Parse(main []string, flags map[string]string) (Command, error
type Sync struct{}
func (s *Sync) Do(deps Dependencies) ([][]string, error) {
func (s *Sync) Do(deps Dependencies) (CommandResult, error) {
// local new and updated
sendItems, err := deps.SyncRepo.FindAll()
if err != nil {
@ -94,5 +94,9 @@ func (s *Sync) Do(deps Dependencies) ([][]string, error) {
}
}
return nil, nil
return SyncResult{}, nil
}
type SyncResult struct{}
func (sr SyncResult) Render() string { return "" }

View File

@ -24,10 +24,10 @@ type UpdateArgs struct {
func NewUpdateArgs() UpdateArgs {
return UpdateArgs{
fieldTPL: map[string][]string{
"date": []string{"d", "date", "on"},
"time": []string{"t", "time", "at"},
"duration": []string{"dur", "duration", "for"},
"recurrer": []string{"rec", "recurrer"},
"date": {"d", "date", "on"},
"time": {"t", "time", "at"},
"duration": {"dur", "duration", "for"},
"recurrer": {"rec", "recurrer"},
},
}
}
@ -85,7 +85,7 @@ type Update struct {
args UpdateArgs
}
func (u *Update) Do(deps Dependencies) ([][]string, error) {
func (u *Update) Do(deps Dependencies) (CommandResult, error) {
id, err := deps.LocalIDRepo.FindOne(u.args.LocalID)
switch {
case errors.Is(err, storage.ErrNotFound):
@ -132,5 +132,11 @@ func (u *Update) Do(deps Dependencies) ([][]string, error) {
return nil, fmt.Errorf("could not store sync item: %v", err)
}
return nil, nil
return UpdateResult{}, nil
}
type UpdateResult struct{}
func (ur UpdateResult) Render() string {
return "task updated"
}

View File

@ -164,6 +164,7 @@ func TestUpdateExecute(t *testing.T) {
},
} {
t.Run(tc.name, func(t *testing.T) {
// setup
taskRepo := memory.NewTask()
localIDRepo := memory.NewLocalID()
syncRepo := memory.NewSync()
@ -182,6 +183,7 @@ func TestUpdateExecute(t *testing.T) {
t.Errorf("exp nil, ,got %v", err)
}
// parse
cmd, actErr := command.NewUpdateArgs().Parse(tc.main, tc.fields)
if tc.expParseErr != (actErr != nil) {
t.Errorf("exp %v, got %v", tc.expParseErr, actErr)
@ -189,6 +191,8 @@ func TestUpdateExecute(t *testing.T) {
if tc.expParseErr {
return
}
// do
_, actDoErr := cmd.Do(command.Dependencies{
TaskRepo: taskRepo,
LocalIDRepo: localIDRepo,
@ -201,6 +205,7 @@ func TestUpdateExecute(t *testing.T) {
return
}
// check
actTask, err := taskRepo.FindOne(tskID)
if err != nil {
t.Errorf("exp nil, got %v", err)