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