- commit
- 514cb079e95ad8265685b49838290e9adf64285e
- parent
- 7e06247f1bdcbf8f9c68999925c108e17543593d
- author
- Dami <dami.etoile@gmail.com>
| M | pdfexport/ | 15 | ++++++--- |
| A | pdfexport/ | 51 | ++++++++++++++++++++++++++++++ |
@@ -74,7 +74,9 @@ func WritePDF(outputPath string, docs []PackDocument, puzzles []Puzzle, cfg Rend
7474 renderCoverPage(pdf, printablePuzzles, cfg)7575 renderTitlePage(pdf, docs, printablePuzzles, cfg)7676 for _, puzzle := range printablePuzzles {77- renderPuzzlePage(pdf, puzzle)77+ if err := renderPuzzlePage(pdf, puzzle); err != nil {78+ return fmt.Errorf("render puzzle %q (%s #%d): %w", puzzle.Name, puzzle.Category, puzzle.Index, err)79+ }7880 }7981 8082 totalPagesWithoutPadding := pdf.PageNo() + 1 // include upcoming back cover@@ -255,13 +257,13 @@ func titlePageSourceTableWhitespace(maxY, sourceStartY float64, docCount int) fl
255257 return 0256258 }257259 258-func renderPuzzlePage(pdf *fpdf.Fpdf, puzzle Puzzle) {260+func renderPuzzlePage(pdf *fpdf.Fpdf, puzzle Puzzle) error {259261 if game.IsNilPrintPayload(puzzle.PrintPayload) {260- return262+ return nil261263 }262264 adapter, ok := game.LookupPrintAdapter(puzzle.Category)263265 if !ok {264- return266+ return nil265267 }266268 267269 pdf.AddPage()@@ -280,7 +282,10 @@ func renderPuzzlePage(pdf *fpdf.Fpdf, puzzle Puzzle) {
280282 }281283 subtitle := strings.Join(subtitleParts, " | ")282284 pdf.CellFormat(pageW, 5, subtitle, "", 0, "C", false, 0, "")283- _ = adapter.RenderPDFBody(pdf, puzzle.PrintPayload)285+ if err := adapter.RenderPDFBody(pdf, puzzle.PrintPayload); err != nil {286+ return err287+ }288+ return nil284289 }285290 286291 func renderNonogramPage(pdf *fpdf.Fpdf, data *NonogramData) {@@ -0,0 +1,51 @@
1+package pdfexport2+3+import (4+ "errors"5+ "path/filepath"6+ "strings"7+ "testing"8+9+ "github.com/FelineStateMachine/puzzletea/game"10+ "github.com/go-pdf/fpdf"11+)12+13+func TestWritePDFReturnsAdapterRenderError(t *testing.T) {14+ const category = "Render Error Test"15+ game.RegisterPrintAdapter(renderErrorTestAdapter{category: category})16+17+ output := filepath.Join(t.TempDir(), "error.pdf")18+ puzzles := []Puzzle{19+ {20+ Category: category,21+ Name: "broken-page",22+ Index: 1,23+ PrintPayload: struct{}{},24+ },25+ }26+27+ err := WritePDF(output, nil, puzzles, RenderConfig{VolumeNumber: 1})28+ if err == nil {29+ t.Fatal("expected adapter render error")30+ }31+ if !strings.Contains(err.Error(), "failed to render body") {32+ t.Fatalf("error = %q, want render failure context", err.Error())33+ }34+ if !strings.Contains(err.Error(), "broken-page") {35+ t.Fatalf("error = %q, want puzzle name context", err.Error())36+ }37+}38+39+type renderErrorTestAdapter struct {40+ category string41+}42+43+func (a renderErrorTestAdapter) CanonicalGameType() string { return a.category }44+func (a renderErrorTestAdapter) Aliases() []string { return nil }45+func (a renderErrorTestAdapter) RenderMarkdownSnippet([]byte) (string, error) {46+ return "", nil47+}48+func (a renderErrorTestAdapter) BuildPDFPayload([]byte, string) (any, error) { return nil, nil }49+func (a renderErrorTestAdapter) RenderPDFBody(*fpdf.Fpdf, any) error {50+ return errors.New("failed to render body")51+}