48 lines
1.2 KiB
Go
48 lines
1.2 KiB
Go
package handler
|
|
|
|
import (
|
|
"errors"
|
|
"net/http"
|
|
|
|
"github.com/iliadenisov/galaxy/internal/controller"
|
|
"github.com/iliadenisov/galaxy/internal/game"
|
|
|
|
"github.com/gin-gonic/gin"
|
|
"github.com/iliadenisov/galaxy/internal/model/rest"
|
|
)
|
|
|
|
type CommandExecutor func(controller.Config, rest.Command) error
|
|
|
|
var (
|
|
ErrCommandNotProcessed = errors.New("command was not processed by executor")
|
|
)
|
|
|
|
func CommandHandler(c *gin.Context, config controller.Config, executor CommandExecutor) {
|
|
var cmd rest.Command
|
|
if err := c.ShouldBindJSON(&cmd); err != nil {
|
|
c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()})
|
|
return
|
|
}
|
|
err := executor(config, cmd)
|
|
switch {
|
|
case err == nil:
|
|
c.Status(http.StatusOK)
|
|
case errors.Is(err, ErrCommandNotProcessed):
|
|
c.Status(http.StatusInternalServerError) // TODO: add error text?
|
|
default:
|
|
// TODO: separate invalid input and game state errors
|
|
c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()})
|
|
}
|
|
}
|
|
|
|
func ExecuteCommand(config controller.Config, cmd rest.Command) error {
|
|
switch {
|
|
case cmd.DeclareWar != nil:
|
|
return game.DeclareWar(config, cmd.Race, cmd.DeclareWar.Opponent)
|
|
case cmd.DeclarePeace != nil:
|
|
return game.DeclarePeace(config, cmd.Race, cmd.DeclareWar.Opponent)
|
|
default:
|
|
return ErrCommandNotProcessed
|
|
}
|
|
}
|