package main import ( "fmt" "os" "strings" ) type Tile struct { Symbol string Color string } func ParseTile(line string) *Tile { line = strings.TrimSpace(line) if len(line) < 2 { return nil } return &Tile{ Symbol: string(line[0]), Color: string(line[1:]), } } func (t *Tile) Save() string { return fmt.Sprintf("%s%s", string(t.Symbol[0]), t.Color) } type TileIndex struct { Tiles []*Tile } func ParseTileIndex(filename string) (*TileIndex, error) { payload, err := os.ReadFile(filename) if err != nil { return nil, err } var ( line string = "" index *TileIndex = &TileIndex{ Tiles: []*Tile{ nil, }, } ) for linenum, b := range payload { if b == '\n' { t := ParseTile(line) if t != nil { index.Tiles = append(index.Tiles, t) } else { fmt.Printf("%d]: Failed parsing tile, '%s'\r\n", linenum, line) } line = "" } else { line += string(b) } } return index, nil } func (ti *TileIndex) Save(filename string) error { f, err := os.Create(filename) if err != nil { return err } defer f.Close() for _, t := range ti.Tiles { if t == nil { continue } _, err = f.WriteString(fmt.Sprintf("%s\n", t.Save())) if err != nil { return err } } return nil }