From 9a30dec1c0ff259de69df4274e568a553d4d0a52 Mon Sep 17 00:00:00 2001 From: Aaron Fischer Date: Thu, 25 Mar 2021 10:43:58 +0100 Subject: [PATCH] Error handling --- cmd/kartograph-map-generator/main.go | 8 +++++++- pkg/generator/svg.go | 11 +++++++++++ pkg/generator/world.go | 19 ++++++++++++++++--- pkg/web/service.go | 27 +++++++++++++++++++++------ pkg/web/static/generator.js | 9 +++++---- pkg/web/templates/index.tpl.html | 4 ++-- 6 files changed, 62 insertions(+), 16 deletions(-) diff --git a/cmd/kartograph-map-generator/main.go b/cmd/kartograph-map-generator/main.go index ad26e75..9316acb 100644 --- a/cmd/kartograph-map-generator/main.go +++ b/cmd/kartograph-map-generator/main.go @@ -5,6 +5,7 @@ import ( "f00860/kartograph-map-editor/pkg/web" "flag" "fmt" + "log" "time" ) @@ -29,7 +30,12 @@ func main() { return } - world := generator.New(size, wastelands, mountains, ruins, seed) + world, err := generator.New(size, wastelands, mountains, ruins, seed) + + if err != nil { + log.Fatal(err) + return + } switch output { case "svg": diff --git a/pkg/generator/svg.go b/pkg/generator/svg.go index 1f3df5f..d60c0e4 100644 --- a/pkg/generator/svg.go +++ b/pkg/generator/svg.go @@ -7,6 +7,17 @@ import ( "github.com/ajstarks/svgo" ) +func ErrorSVG(err error, width int, height int) string { + buf := bytes.NewBufferString("") + canvas := svg.New(buf) + + canvas.Start(width, height) + canvas.Text(width/2, height/2, err.Error(), "text-anchor:middle;font-size:3px;font-family:Courier New;font-weight:light;") + canvas.End() + + return buf.String() +} + func (w World) SVG() string { // DIN-A5 width := 148 * 3 diff --git a/pkg/generator/world.go b/pkg/generator/world.go index eb3f430..fb304f5 100644 --- a/pkg/generator/world.go +++ b/pkg/generator/world.go @@ -91,7 +91,7 @@ func (w World) JSON() string { return string(output) } -func New(size int, numWastelands int, numMountains int, numRuins int, seed string) World { +func New(size int, numWastelands int, numMountains int, numRuins int, seed string) (World, error) { InitSeed(seed) w := World{ @@ -102,7 +102,9 @@ func New(size int, numWastelands int, numMountains int, numRuins int, seed strin Seed: seed, } - // TODO: Return error wenn kein Platz mehr da ist + if size < 3 || size > 25 { + return World{}, errors.New("Spielfeldgröße nicht im Bereich 3..25.") + } // All empty for start for i := 0; i < w.Size*w.Size; i++ { @@ -114,6 +116,10 @@ func New(size int, numWastelands int, numMountains int, numRuins int, seed strin var wastelands []int if numWastelands > 0 { + if numWastelands > size*size { + return World{}, errors.New("Zu viele Ödlandfelder.") + } + startPos := roll(w.Size-1) + roll(w.Size-1)*w.Size w.place(WastelandTerritory, startPos) wastelands = append(wastelands, startPos) @@ -150,6 +156,10 @@ func New(size int, numWastelands int, numMountains int, numRuins int, seed strin candidates = append(candidates, pos) } } + + if len(candidates) < 1 { + return World{}, errors.New("Zu viele Berge.") + } w.place(MountainTerritory, randomItem(candidates)) } @@ -165,10 +175,13 @@ func New(size int, numWastelands int, numMountains int, numRuins int, seed strin candidates = append(candidates, pos) } } + if len(candidates) < 1 { + return World{}, errors.New("Zu viele Ruinen.") + } w.place(RuinsTerritory, randomItem(candidates)) } - return w + return w, nil } func InitSeed(seed string) { diff --git a/pkg/web/service.go b/pkg/web/service.go index c49f58d..d9934c7 100644 --- a/pkg/web/service.go +++ b/pkg/web/service.go @@ -3,6 +3,7 @@ package web import ( "embed" "f00860/kartograph-map-editor/pkg/generator" + "fmt" "html/template" "io" "log" @@ -33,7 +34,7 @@ func Start(address string, port int) { } } -func worldFromRequest(req *http.Request) generator.World { +func worldFromRequest(req *http.Request) (generator.World, error) { size, err := strconv.Atoi(req.URL.Query().Get("s")) if err != nil { size = 11 @@ -59,16 +60,30 @@ func worldFromRequest(req *http.Request) generator.World { } func mapHandler(w http.ResponseWriter, req *http.Request) { - world := worldFromRequest(req) log.Printf("GET /map.svg?%v (%v)", req.URL.Query().Encode(), req.RemoteAddr) + + var SVGContent string + + world, err := worldFromRequest(req) + if err != nil { + SVGContent = generator.ErrorSVG(err, 100, 100) + } else { + SVGContent = world.SVG() + } + w.Header().Set("Content-Type", "image/svg+xml") - w.Header().Set("Content-Length", strconv.Itoa(len(world.SVG()))) - io.WriteString(w, world.SVG()) + w.Header().Set("Content-Length", strconv.Itoa(len(SVGContent))) + io.WriteString(w, SVGContent) } func printHandler(w http.ResponseWriter, req *http.Request) { - world := worldFromRequest(req) log.Printf("GET /print?%v (%v)", req.URL.Query().Encode(), req.RemoteAddr) + + world, err := worldFromRequest(req) + if err != nil { + fmt.Print(err) + return + } tpl, err := template.ParseFS(templateFiles, "templates/print.tpl.html") if err != nil { @@ -80,7 +95,7 @@ func printHandler(w http.ResponseWriter, req *http.Request) { func indexHandler(w http.ResponseWriter, req *http.Request) { seed := generator.RandomSeed() - world := generator.New(11, 7, 5, 6, seed) + world, _ := generator.New(11, 7, 5, 6, seed) log.Printf("GET / (%v) Seed: %v", req.RemoteAddr, seed) tpl, err := template.ParseFS(templateFiles, "templates/index.tpl.html") diff --git a/pkg/web/static/generator.js b/pkg/web/static/generator.js index 2fe3377..99efefa 100644 --- a/pkg/web/static/generator.js +++ b/pkg/web/static/generator.js @@ -7,19 +7,20 @@ document.addEventListener('DOMContentLoaded', function() { let map = document.querySelector('.map') // Generate new random seed - let newMapUrl = '/map.svg?seed=' + seed + + let newMapParams = '?seed=' + seed + '&s=' + size + '&w=' + wastelands + '&m=' + mountains + '&r=' + ruins - document.querySelector('.map').setAttribute('src', newMapUrl); - document.querySelector('#map-link').setAttribute('href', newMapUrl); + document.querySelector('.map').setAttribute('src', '/map.svg' + newMapParams); + document.querySelector('#print-button').setAttribute('data-target', '/print' + newMapParams); + document.querySelector('#map-button').setAttribute('data-target', '/map.svg' + newMapParams); + document.querySelector('#map-link').setAttribute('data-target', '/map.svg' + newMapParams); }; let actionButtons = document.querySelectorAll('button[class="action"]'); Array.prototype.forEach.call(actionButtons, function(action, i) { action.addEventListener('click', function(e) { - console.log("adsf"); document.location.href = e.target.getAttribute('data-target'); }); }); diff --git a/pkg/web/templates/index.tpl.html b/pkg/web/templates/index.tpl.html index 76aad92..9032065 100644 --- a/pkg/web/templates/index.tpl.html +++ b/pkg/web/templates/index.tpl.html @@ -49,8 +49,8 @@ - - + +

2011 Aaron Fischer