48 lines
1.1 KiB
Go
48 lines
1.1 KiB
Go
package commandctrl
|
|
|
|
import (
|
|
"context"
|
|
"github.com/lmika/awstools/internal/common/ui/events"
|
|
"github.com/lmika/awstools/internal/common/ui/uimodels"
|
|
"github.com/lmika/shellwords"
|
|
"github.com/pkg/errors"
|
|
"strings"
|
|
)
|
|
|
|
type CommandController struct {
|
|
commands map[string]uimodels.Operation
|
|
}
|
|
|
|
func NewCommandController(commands map[string]uimodels.Operation) *CommandController {
|
|
return &CommandController{
|
|
commands: commands,
|
|
}
|
|
}
|
|
|
|
func (c *CommandController) Prompt() uimodels.Operation {
|
|
return uimodels.OperationFn(func(ctx context.Context) error {
|
|
uiCtx := uimodels.Ctx(ctx)
|
|
uiCtx.Send(events.PromptForInput{
|
|
Prompt: ":",
|
|
OnDone: c.Execute(),
|
|
})
|
|
return nil
|
|
})
|
|
}
|
|
|
|
func (c *CommandController) Execute() uimodels.Operation {
|
|
return uimodels.OperationFn(func(ctx context.Context) error {
|
|
input := strings.TrimSpace(uimodels.PromptValue(ctx))
|
|
if input == "" {
|
|
return nil
|
|
}
|
|
|
|
tokens := shellwords.Split(input)
|
|
command, ok := c.commands[tokens[0]]
|
|
if !ok {
|
|
return errors.New("no such command: " + tokens[0])
|
|
}
|
|
|
|
return command.Execute(WithCommandArgs(ctx, tokens[1:]))
|
|
})
|
|
} |