clone

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

main
puzzletea / games / sudokurgb / export.go
export.go 1.7K
1package sudokurgb23import (4 "encoding/json"5 "fmt"6 "strings"7)89type exportCell struct {10 X int `json:"x"`11 Y int `json:"y"`12 V int `json:"v"`13}1415type Save struct {16 Grid string `json:"grid"`17 Provided []exportCell `json:"provided"`18 ModeTitle string `json:"mode_title,omitempty"`19}2021func gridToString(g grid) string {22 var b strings.Builder23 for y := range gridSize {24 for x := range gridSize {25 b.WriteByte(byte('0' + g[y][x].v))26 }27 if y < gridSize-1 {28 b.WriteByte('\n')29 }30 }31 return b.String()32}3334func ImportModel(data []byte) (*Model, error) {35 var save Save36 if err := json.Unmarshal(data, &save); err != nil {37 return nil, err38 }3940 provided := make([]cell, len(save.Provided))41 for i, ec := range save.Provided {42 provided[i] = cell{x: ec.X, y: ec.Y, v: ec.V}43 }4445 g := newGrid(provided)46 rows := strings.Split(save.Grid, "\n")47 for y := 0; y < gridSize && y < len(rows); y++ {48 for x := 0; x < gridSize && x < len(rows[y]); x++ {49 value := int(rows[y][x] - '0')50 if value >= 1 && value <= valueCount {51 g[y][x].v = value52 }53 }54 }5556 return &Model{57 grid: g,58 provided: provided,59 providedGrid: buildProvidedGrid(provided),60 analysis: analyzeGrid(g),61 modeTitle: save.ModeTitle,62 keys: DefaultKeyMap,63 }, nil64}6566func (m Model) GetSave() ([]byte, error) {67 provided := make([]exportCell, len(m.provided))68 for i, c := range m.provided {69 provided[i] = exportCell{X: c.x, Y: c.y, V: c.v}70 }71 save := Save{72 Grid: gridToString(m.grid),73 Provided: provided,74 ModeTitle: m.modeTitle,75 }76 jsonData, err := json.Marshal(save)77 if err != nil {78 return nil, fmt.Errorf("unable to marshal save data: %w", err)79 }80 return jsonData, nil81}