generated from templates/go-generic
refactor: move executorfunc map
Move the executorFunc map to internal/executors.
This commit is contained in:
parent
cfa6a4abad
commit
15386cdb9f
14 changed files with 60 additions and 64 deletions
|
@ -10,7 +10,7 @@ import (
|
|||
"github.com/google/uuid"
|
||||
)
|
||||
|
||||
func AddFeed(s *state.State, exe Executor, user database.User) error {
|
||||
func addFeed(s *state.State, exe executor, user database.User) error {
|
||||
wantArgs := 2
|
||||
|
||||
if len(exe.Args) != wantArgs {
|
||||
|
|
|
@ -12,7 +12,7 @@ import (
|
|||
"github.com/google/uuid"
|
||||
)
|
||||
|
||||
func Aggregate(s *state.State, exe Executor) error {
|
||||
func aggregate(s *state.State, exe executor) error {
|
||||
if len(exe.Args) != 1 {
|
||||
return fmt.Errorf("unexpected number of arguments: want 1, got %d", len(exe.Args))
|
||||
}
|
||||
|
|
|
@ -9,7 +9,7 @@ import (
|
|||
"codeflow.dananglin.me.uk/apollo/gator/internal/state"
|
||||
)
|
||||
|
||||
func Browse(s *state.State, exe Executor, user database.User) error {
|
||||
func browse(s *state.State, exe executor, user database.User) error {
|
||||
if len(exe.Args) > 1 {
|
||||
return fmt.Errorf("unexpected number of arguments: want 0 or 1, got %d", len(exe.Args))
|
||||
}
|
||||
|
|
|
@ -1,31 +1,65 @@
|
|||
package executors
|
||||
|
||||
import (
|
||||
"errors"
|
||||
"fmt"
|
||||
|
||||
"codeflow.dananglin.me.uk/apollo/gator/internal/state"
|
||||
)
|
||||
|
||||
type ExecutorMap struct {
|
||||
Map map[string]ExecutorFunc
|
||||
}
|
||||
type executorFunc func(*state.State, executor) error
|
||||
|
||||
type ExecutorFunc func(*state.State, Executor) error
|
||||
|
||||
type Executor struct {
|
||||
type executor struct {
|
||||
Name string
|
||||
Args []string
|
||||
}
|
||||
|
||||
func (e *ExecutorMap) Register(name string, f ExecutorFunc) {
|
||||
e.Map[name] = f
|
||||
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)
|
||||
}
|
||||
|
||||
func (e *ExecutorMap) Run(s *state.State, exe Executor) error {
|
||||
runFunc, ok := e.Map[exe.Name]
|
||||
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),
|
||||
}
|
||||
}
|
||||
|
|
|
@ -7,7 +7,7 @@ import (
|
|||
"codeflow.dananglin.me.uk/apollo/gator/internal/state"
|
||||
)
|
||||
|
||||
func Feeds(s *state.State, _ Executor) error {
|
||||
func feeds(s *state.State, _ executor) error {
|
||||
feeds, err := s.DB.GetAllFeeds(context.Background())
|
||||
if err != nil {
|
||||
return fmt.Errorf("unable to get the feeds from the database: %w", err)
|
||||
|
|
|
@ -11,7 +11,7 @@ import (
|
|||
"github.com/google/uuid"
|
||||
)
|
||||
|
||||
func Follow(s *state.State, exe Executor, user database.User) error {
|
||||
func follow(s *state.State, exe executor, user database.User) error {
|
||||
wantNumArgs := 1
|
||||
|
||||
if len(exe.Args) != wantNumArgs {
|
||||
|
|
|
@ -8,7 +8,7 @@ import (
|
|||
"codeflow.dananglin.me.uk/apollo/gator/internal/state"
|
||||
)
|
||||
|
||||
func Following(s *state.State, _ Executor, user database.User) error {
|
||||
func following(s *state.State, _ executor, user database.User) error {
|
||||
following, err := s.DB.GetFeedFollowsForUser(context.Background(), user.ID)
|
||||
if err != nil {
|
||||
return fmt.Errorf("unable to get the list of feeds from the database: %w", err)
|
||||
|
|
|
@ -7,7 +7,7 @@ import (
|
|||
"codeflow.dananglin.me.uk/apollo/gator/internal/state"
|
||||
)
|
||||
|
||||
func Login(s *state.State, exe Executor) error {
|
||||
func login(s *state.State, exe executor) error {
|
||||
if len(exe.Args) != 1 {
|
||||
return fmt.Errorf("unexpected number of arguments: want 1, got %d", len(exe.Args))
|
||||
}
|
||||
|
|
|
@ -8,8 +8,8 @@ import (
|
|||
"codeflow.dananglin.me.uk/apollo/gator/internal/state"
|
||||
)
|
||||
|
||||
func MiddlewareLoggedIn(handler func(s *state.State, exe Executor, user database.User) error) ExecutorFunc {
|
||||
return func(s *state.State, exe Executor) error {
|
||||
func middlewareLoggedIn(handler func(s *state.State, exe executor, user database.User) error) executorFunc {
|
||||
return func(s *state.State, exe executor) error {
|
||||
user, err := s.DB.GetUserByName(context.Background(), s.Config.CurrentUsername)
|
||||
if err != nil {
|
||||
return fmt.Errorf("unable to get the user from the database: %w", err)
|
||||
|
|
|
@ -11,7 +11,7 @@ import (
|
|||
"github.com/google/uuid"
|
||||
)
|
||||
|
||||
func Register(s *state.State, exe Executor) error {
|
||||
func register(s *state.State, exe executor) error {
|
||||
if len(exe.Args) != 1 {
|
||||
return fmt.Errorf("unexpected number of arguments: want 1, got %d", len(exe.Args))
|
||||
}
|
||||
|
|
|
@ -7,7 +7,7 @@ import (
|
|||
"codeflow.dananglin.me.uk/apollo/gator/internal/state"
|
||||
)
|
||||
|
||||
func Reset(s *state.State, _ Executor) error {
|
||||
func reset(s *state.State, _ executor) error {
|
||||
if err := s.DB.DeleteAllUsers(context.Background()); err != nil {
|
||||
fmt.Errorf("unable to delete the users from the database: %w", err)
|
||||
}
|
||||
|
|
|
@ -8,7 +8,7 @@ import (
|
|||
"codeflow.dananglin.me.uk/apollo/gator/internal/state"
|
||||
)
|
||||
|
||||
func Unfollow(s *state.State, exe Executor, user database.User) error {
|
||||
func unfollow(s *state.State, exe executor, user database.User) error {
|
||||
wantNumArgs := 1
|
||||
|
||||
if len(exe.Args) != wantNumArgs {
|
||||
|
|
|
@ -7,7 +7,7 @@ import (
|
|||
"codeflow.dananglin.me.uk/apollo/gator/internal/state"
|
||||
)
|
||||
|
||||
func Users(s *state.State, _ Executor) error {
|
||||
func users(s *state.State, _ executor) error {
|
||||
users, err := s.DB.GetAllUsers(context.Background())
|
||||
if err != nil {
|
||||
fmt.Errorf("unable to get the users from the database: %w", err)
|
||||
|
|
42
main.go
42
main.go
|
@ -2,7 +2,6 @@ package main
|
|||
|
||||
import (
|
||||
"database/sql"
|
||||
"errors"
|
||||
"fmt"
|
||||
"os"
|
||||
|
||||
|
@ -43,44 +42,7 @@ func run() error {
|
|||
Config: &cfg,
|
||||
}
|
||||
|
||||
executorMap := executors.ExecutorMap{
|
||||
Map: make(map[string]executors.ExecutorFunc),
|
||||
}
|
||||
args := os.Args[1:]
|
||||
|
||||
executorMap.Register("login", executors.Login)
|
||||
executorMap.Register("register", executors.Register)
|
||||
executorMap.Register("reset", executors.Reset)
|
||||
executorMap.Register("users", executors.Users)
|
||||
executorMap.Register("aggregate", executors.Aggregate)
|
||||
executorMap.Register("addfeed", executors.MiddlewareLoggedIn(executors.AddFeed))
|
||||
executorMap.Register("feeds", executors.Feeds)
|
||||
executorMap.Register("follow", executors.MiddlewareLoggedIn(executors.Follow))
|
||||
executorMap.Register("unfollow", executors.MiddlewareLoggedIn(executors.Unfollow))
|
||||
executorMap.Register("following", executors.MiddlewareLoggedIn(executors.Following))
|
||||
executorMap.Register("browse", executors.MiddlewareLoggedIn(executors.Browse))
|
||||
|
||||
executor, err := parseArgs(os.Args[1:])
|
||||
if err != nil {
|
||||
return fmt.Errorf("unable to parse the command: %w", err)
|
||||
}
|
||||
|
||||
return executorMap.Run(&s, executor)
|
||||
}
|
||||
|
||||
func parseArgs(args []string) (executors.Executor, error) {
|
||||
if len(args) == 0 {
|
||||
return executors.Executor{}, errors.New("no arguments given")
|
||||
}
|
||||
|
||||
if len(args) == 1 {
|
||||
return executors.Executor{
|
||||
Name: args[0],
|
||||
Args: make([]string, 0),
|
||||
}, nil
|
||||
}
|
||||
|
||||
return executors.Executor{
|
||||
Name: args[0],
|
||||
Args: args[1:],
|
||||
}, nil
|
||||
return executors.Run(&s, args)
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue