clone

fifteen puzzle games for the terminal, with daily puzzles, weekly ladders and xp, built on bubble tea

bug/architecture-test-trim-path
puzzletea / export / pdf / print_adapter.go
print_adapter.go 1.5K
1// Package pdfexport owns the printable export pipeline: adapter registration,2// JSONL ingestion, payload building, ordering, and PDF rendering.3package pdfexport45import (6 "reflect"78 "codeberg.org/go-pdf/fpdf"9 "github.com/FelineStateMachine/puzzletea/puzzle"10)1112type PrintAdapter interface {13 CanonicalGameType() string14 Aliases() []string15 BuildPDFPayload(save []byte) (any, error)16 RenderPDFBody(pdf *fpdf.Fpdf, payload any) error17}1819var printAdapterRegistry = map[string]PrintAdapter{}2021func RegisterPrintAdapter(adapter PrintAdapter) {22 canonical := normalizeGameTypeToken(adapter.CanonicalGameType())23 if canonical == "" {24 return25 }2627 printAdapterRegistry[canonical] = adapter28 for _, alias := range adapter.Aliases() {29 normalized := normalizeGameTypeToken(alias)30 if normalized == "" {31 continue32 }33 printAdapterRegistry[normalized] = adapter34 }35}3637func LookupPrintAdapter(gameType string) (PrintAdapter, bool) {38 adapter, ok := printAdapterRegistry[normalizeGameTypeToken(gameType)]39 return adapter, ok40}4142func HasPrintAdapter(gameType string) bool {43 _, ok := LookupPrintAdapter(gameType)44 return ok45}4647func IsNilPrintPayload(payload any) bool {48 if payload == nil {49 return true50 }5152 v := reflect.ValueOf(payload)53 switch v.Kind() {54 case reflect.Chan, reflect.Func, reflect.Interface, reflect.Map, reflect.Pointer, reflect.Slice:55 return v.IsNil()56 default:57 return false58 }59}6061func normalizeGameTypeToken(s string) string {62 return puzzle.NormalizeName(s)63}