planner/plan/cli/cli.go

58 lines
1.2 KiB
Go
Raw Permalink Normal View History

2025-01-19 10:56:03 +01:00
package cli
import (
"errors"
"fmt"
"go-mod.ewintr.nl/planner/plan/cli/arg"
"go-mod.ewintr.nl/planner/plan/command"
"go-mod.ewintr.nl/planner/plan/command/schedule"
"go-mod.ewintr.nl/planner/plan/command/task"
"go-mod.ewintr.nl/planner/sync/client"
)
type CLI struct {
repos command.Repositories
client client.Client
cmdArgs []command.CommandArgs
}
func NewCLI(repos command.Repositories, client client.Client) *CLI {
return &CLI{
repos: repos,
client: client,
cmdArgs: []command.CommandArgs{
command.NewSyncArgs(),
// task
task.NewShowArgs(), task.NewProjectsArgs(),
task.NewAddArgs(), task.NewDeleteArgs(), task.NewListArgs(),
task.NewUpdateArgs(),
// schedule
schedule.NewAddArgs(),
},
}
}
func (cli *CLI) Run(args []string) error {
main, fields := arg.FindFields(args)
for _, ca := range cli.cmdArgs {
cmd, err := ca.Parse(main, fields)
switch {
case errors.Is(err, command.ErrWrongCommand):
continue
case err != nil:
return err
}
result, err := cmd.Do(cli.repos, cli.client)
if err != nil {
return err
}
fmt.Println(result.Render())
return nil
}
return fmt.Errorf("could not find matching command")
}