gator/internal/executors/executors.go

66 lines
1.2 KiB
Go
Raw Permalink Normal View History

package executors
import (
"errors"
"fmt"
"codeflow.dananglin.me.uk/apollo/gator/internal/state"
)
type executorFunc func(*state.State, executor) error
type executor struct {
Name string
Args []string
}
func Run(s *state.State, args []string) error {
exe, err := newExecutor(args)
if err != nil {
return fmt.Errorf("unable to parse the command: %w", err)
}
exeMap := executorFuncMap()
runFunc, ok := exeMap[exe.Name]
if !ok {
return fmt.Errorf("unrecognised command: %s", exe.Name)
}
return runFunc(s, exe)
}
func newExecutor(args []string) (executor, error) {
if len(args) == 0 {
return executor{}, errors.New("no arguments given")
}
if len(args) == 1 {
return executor{
Name: args[0],
Args: make([]string, 0),
}, nil
}
return executor{
Name: args[0],
Args: args[1:],
}, nil
}
func executorFuncMap() map[string]executorFunc {
return map[string]executorFunc{
"login": login,
"register": register,
"reset": reset,
"users": users,
"aggregate": aggregate,
"addfeed": middlewareLoggedIn(addFeed),
"feeds": feeds,
"follow": middlewareLoggedIn(follow),
"unfollow": middlewareLoggedIn(unfollow),
"following": middlewareLoggedIn(following),
"browse": middlewareLoggedIn(browse),
}
}