refactor: move executorfunc map

Move the executorFunc map to internal/executors.
This commit is contained in:
Dan Anglin 2024-10-03 03:37:52 +01:00
parent cfa6a4abad
commit 15386cdb9f
Signed by: dananglin
GPG key ID: 0C1D44CFBEE68638
14 changed files with 60 additions and 64 deletions

View file

@ -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 {

View file

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

View file

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

View file

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

View file

@ -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)

View file

@ -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 {

View file

@ -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)

View file

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

View file

@ -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)

View file

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

View file

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

View file

@ -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 {

View file

@ -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
View file

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