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