Files
gator/internal/command/command.go
T

77 lines
1.2 KiB
Go

package command
import (
"fmt"
"github.com/StevanFreeborn/gator/internal/state"
)
type Command struct {
Name string
Handler CommandHandler
}
type CommandHandler func(s *state.State) error
func newCommand(name string, handler CommandHandler) *Command {
return &Command{
Name: name,
Handler: handler,
}
}
type CommandRegistry struct {
commands map[string]*Command
}
func (c *CommandRegistry) register(cmd *Command) error {
c.commands[cmd.Name] = cmd
return nil
}
func NewRegistry() *CommandRegistry {
cr := CommandRegistry{
commands: map[string]*Command{},
}
commands := []*Command{
loginCommand(),
}
for _, cmd := range commands {
cr.register(cmd)
}
return &cr
}
func (c *CommandRegistry) RunCommand(cmdName string, s *state.State) error {
cmd, found := c.commands[cmdName]
if !found {
return fmt.Errorf("No '%s' registered", cmdName)
}
return cmd.Handler(s)
}
func loginCommand() *Command {
return newCommand("login", func(s *state.State) error {
if len(s.Arguments) == 0 {
return fmt.Errorf("Did not receive expected username argument")
}
username := s.Arguments[0]
err := s.Config.SetUser(username)
if err != nil {
return err
}
fmt.Printf("Current user set to '%s'\n", username)
return nil
})
}