From 15386cdb9f3685e98e8fc7c0df36a5043d184e89 Mon Sep 17 00:00:00 2001 From: Dan Anglin Date: Thu, 3 Oct 2024 03:37:52 +0100 Subject: [PATCH] refactor: move executorfunc map Move the executorFunc map to internal/executors. --- internal/executors/addfeed.go | 2 +- internal/executors/aggregate.go | 2 +- internal/executors/browse.go | 2 +- internal/executors/executors.go | 56 +++++++++++++++++++++++++------- internal/executors/feeds.go | 2 +- internal/executors/follow.go | 2 +- internal/executors/following.go | 2 +- internal/executors/login.go | 2 +- internal/executors/middleware.go | 4 +-- internal/executors/register.go | 2 +- internal/executors/reset.go | 2 +- internal/executors/unfollow.go | 2 +- internal/executors/users.go | 2 +- main.go | 42 ++---------------------- 14 files changed, 60 insertions(+), 64 deletions(-) diff --git a/internal/executors/addfeed.go b/internal/executors/addfeed.go index 6beccc1..9001fe6 100644 --- a/internal/executors/addfeed.go +++ b/internal/executors/addfeed.go @@ -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 { diff --git a/internal/executors/aggregate.go b/internal/executors/aggregate.go index 4f58104..8a0be7e 100644 --- a/internal/executors/aggregate.go +++ b/internal/executors/aggregate.go @@ -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)) } diff --git a/internal/executors/browse.go b/internal/executors/browse.go index a78d20e..1d17c63 100644 --- a/internal/executors/browse.go +++ b/internal/executors/browse.go @@ -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)) } diff --git a/internal/executors/executors.go b/internal/executors/executors.go index fc9b967..71b32d4 100644 --- a/internal/executors/executors.go +++ b/internal/executors/executors.go @@ -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), + } +} diff --git a/internal/executors/feeds.go b/internal/executors/feeds.go index 9cb25cd..c69e04d 100644 --- a/internal/executors/feeds.go +++ b/internal/executors/feeds.go @@ -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) diff --git a/internal/executors/follow.go b/internal/executors/follow.go index 1c14f1c..e3e15ae 100644 --- a/internal/executors/follow.go +++ b/internal/executors/follow.go @@ -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 { diff --git a/internal/executors/following.go b/internal/executors/following.go index 0761c25..79781a0 100644 --- a/internal/executors/following.go +++ b/internal/executors/following.go @@ -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) diff --git a/internal/executors/login.go b/internal/executors/login.go index dc222cf..e47a1d9 100644 --- a/internal/executors/login.go +++ b/internal/executors/login.go @@ -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)) } diff --git a/internal/executors/middleware.go b/internal/executors/middleware.go index 1be5426..65f7e2c 100644 --- a/internal/executors/middleware.go +++ b/internal/executors/middleware.go @@ -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) diff --git a/internal/executors/register.go b/internal/executors/register.go index f6bb0a6..44be362 100644 --- a/internal/executors/register.go +++ b/internal/executors/register.go @@ -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)) } diff --git a/internal/executors/reset.go b/internal/executors/reset.go index df6c5ba..2792491 100644 --- a/internal/executors/reset.go +++ b/internal/executors/reset.go @@ -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) } diff --git a/internal/executors/unfollow.go b/internal/executors/unfollow.go index 6c15850..f7c655b 100644 --- a/internal/executors/unfollow.go +++ b/internal/executors/unfollow.go @@ -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 { diff --git a/internal/executors/users.go b/internal/executors/users.go index 89a215c..97f8a00 100644 --- a/internal/executors/users.go +++ b/internal/executors/users.go @@ -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) diff --git a/main.go b/main.go index e5336ab..86dcfe0 100644 --- a/main.go +++ b/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) }