1package spellpuzzle23import "encoding/json"45type Save struct {6 ModeTitle string `json:"mode_title"`7 Bank string `json:"bank"`8 BankColors []int `json:"bank_colors,omitempty"`9 Placements []WordPlacement `json:"placements"`10 BonusWords []string `json:"bonus_words"`11 Trace []int `json:"trace"`12 BankCursor int `json:"bank_cursor"`13 Solved bool `json:"solved"`14 Feedback feedback `json:"feedback"`15 ShowFullHelp bool `json:"show_full_help"`16}1718func ImportModel(data []byte) (*Model, error) {19 var exported Save20 if err := json.Unmarshal(data, &exported); err != nil {21 return nil, err22 }2324 model := &Model{25 modeTitle: exported.ModeTitle,26 bank: []rune(exported.Bank),27 bankColorSlots: append([]int(nil), exported.BankColors...),28 placements: append([]WordPlacement(nil), exported.Placements...),29 bonusWords: append([]string(nil), exported.BonusWords...),30 trace: append([]int(nil), exported.Trace...),31 bankCursor: exported.BankCursor,32 solved: exported.Solved,33 feedback: exported.Feedback,34 showFullHelp: exported.ShowFullHelp,35 keys: DefaultKeyMap,36 }37 model.rebuildDerivedState()38 return model, nil39}4041func (m Model) GetSave() ([]byte, error) {42 data := Save{43 ModeTitle: m.modeTitle,44 Bank: string(m.bank),45 BankColors: append([]int(nil), m.bankColorSlots...),46 Placements: append([]WordPlacement(nil), m.placements...),47 BonusWords: append([]string(nil), m.bonusWords...),48 Trace: append([]int(nil), m.trace...),49 BankCursor: m.bankCursor,50 Solved: m.solved,51 Feedback: m.feedback,52 ShowFullHelp: m.showFullHelp,53 }54 return json.Marshal(data)55}