Skip to content

Commit

Permalink
fix(#93): unexpected error during color scheme read
Browse files Browse the repository at this point in the history
  • Loading branch information
mk-5 committed Jan 16, 2024
1 parent 55fdede commit dd9a2bf
Showing 1 changed file with 25 additions and 18 deletions.
43 changes: 25 additions & 18 deletions internal/app/colors.go
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,6 @@ import (
"github.com/gdamore/tcell/v2"
"gopkg.in/yaml.v3"
"os"
"strings"
)

var (
Expand All @@ -14,24 +13,13 @@ var (
)

func Color(c string) tcell.Color {
if len(colorsMap) == 0 {
MustLoadColorScheme()
}
if color, ok := colorsMap[c]; ok {
return color
}
parts := strings.Split(c, ".")
var t interface{}
var hex string
t = schemeMap
for _, p := range parts {
if m, ok := t.(map[string]interface{}); ok {
t = m[p]
}
if h, ok := t.(string); ok {
hex = h
}
}
color := tcell.GetColor(hex)
colorsMap[c] = color
return color
panic("unknown color " + c)
}

func MustLoadColorScheme() map[string]interface{} {
Expand All @@ -40,12 +28,31 @@ func MustLoadColorScheme() map[string]interface{} {
b, err := os.ReadFile(p)
if err != nil {
schemeMap = parseYMLStr(defaultColorsYML())
return schemeMap
} else {
schemeMap = parseYMLStr(string(b))
}
schemeMap = parseYMLStr(string(b))
colorsMap = parseYamlToDotNotationMap("", schemeMap, colorsMap)
return schemeMap
}

func parseYamlToDotNotationMap(prefix string, yml map[string]interface{}, targetMap map[string]tcell.Color) map[string]tcell.Color {
var key string
for k, v := range yml {
if prefix == "" {
key = k
} else {
key = fmt.Sprintf("%s.%s", prefix, k)
}
if m, ok := v.(map[string]interface{}); ok {
targetMap = parseYamlToDotNotationMap(key, m, targetMap)
}
if h, ok := v.(string); ok {
targetMap[key] = tcell.GetColor(h)
}
}
return targetMap
}

func parseYMLStr(y string) map[string]interface{} {
var yml map[string]interface{}
err := yaml.Unmarshal([]byte(y), &yml)
Expand Down

0 comments on commit dd9a2bf

Please sign in to comment.