tile.go 1.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778
  1. package main
  2. import (
  3. "fmt"
  4. "os"
  5. "strings"
  6. )
  7. type Tile struct {
  8. Symbol string
  9. Color string
  10. }
  11. func ParseTile(line string) *Tile {
  12. line = strings.TrimSpace(line)
  13. if len(line) < 2 {
  14. return nil
  15. }
  16. return &Tile{
  17. Symbol: string(line[0]),
  18. Color: string(line[1:]),
  19. }
  20. }
  21. func (t *Tile) Save() string {
  22. return fmt.Sprintf("%s%s", string(t.Symbol[0]), t.Color)
  23. }
  24. type TileIndex struct {
  25. Tiles []*Tile
  26. }
  27. func ParseTileIndex(filename string) (*TileIndex, error) {
  28. payload, err := os.ReadFile(filename)
  29. if err != nil {
  30. return nil, err
  31. }
  32. var (
  33. line string = ""
  34. index *TileIndex = &TileIndex{
  35. Tiles: []*Tile{
  36. nil,
  37. },
  38. }
  39. )
  40. for linenum, b := range payload {
  41. if b == '\n' {
  42. t := ParseTile(line)
  43. if t != nil {
  44. index.Tiles = append(index.Tiles, t)
  45. } else {
  46. fmt.Printf("%d]: Failed parsing tile, '%s'\r\n", linenum, line)
  47. }
  48. line = ""
  49. } else {
  50. line += string(b)
  51. }
  52. }
  53. return index, nil
  54. }
  55. func (ti *TileIndex) Save(filename string) error {
  56. f, err := os.Create(filename)
  57. if err != nil {
  58. return err
  59. }
  60. defer f.Close()
  61. for _, t := range ti.Tiles {
  62. if t == nil {
  63. continue
  64. }
  65. _, err = f.WriteString(fmt.Sprintf("%s\n", t.Save()))
  66. if err != nil {
  67. return err
  68. }
  69. }
  70. return nil
  71. }