58 lines
1.2 KiB
Go
58 lines
1.2 KiB
Go
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")
|
|
}
|