generated from templates/go-generic
65 lines
1.2 KiB
Go
65 lines
1.2 KiB
Go
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),
|
|
}
|
|
}
|