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 }) }