46 lines
1.1 KiB
Go
46 lines
1.1 KiB
Go
package router
|
|
|
|
import (
|
|
"errors"
|
|
"net/http"
|
|
|
|
"github.com/iliadenisov/galaxy/internal/game"
|
|
|
|
"github.com/gin-gonic/gin"
|
|
"github.com/iliadenisov/galaxy/internal/model/rest"
|
|
)
|
|
|
|
var (
|
|
ErrCommandNotProcessed = errors.New("command was not processed by executor")
|
|
)
|
|
|
|
func CommandHandler(c *gin.Context, executor Executor) {
|
|
var cmd rest.Command
|
|
if err := c.ShouldBindJSON(&cmd); err != nil {
|
|
c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()})
|
|
return
|
|
}
|
|
err := executor(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 Execute(cmd rest.Command) error {
|
|
p := param()
|
|
switch {
|
|
case cmd.DeclareWar != nil:
|
|
return game.DeclareWar(p, cmd.Race, cmd.DeclareWar.Opponent)
|
|
case cmd.DeclarePeace != nil:
|
|
return game.DeclarePeace(p, cmd.Race, cmd.DeclareWar.Opponent)
|
|
default:
|
|
return ErrCommandNotProcessed
|
|
}
|
|
}
|