83 lines
1.8 KiB
Go
83 lines
1.8 KiB
Go
package config
|
|
|
|
import (
|
|
"fmt"
|
|
"io/ioutil"
|
|
"os"
|
|
"path"
|
|
)
|
|
|
|
type Theme struct {
|
|
Black string
|
|
Red string
|
|
Green string
|
|
Yellow string
|
|
Blue string
|
|
Magenta string
|
|
Cyan string
|
|
White string
|
|
BrightBlack string
|
|
BrightRed string
|
|
BrightGreen string
|
|
BrightYellow string
|
|
BrightBlue string
|
|
BrightMagenta string
|
|
BrightCyan string
|
|
BrightWhite string
|
|
Background string
|
|
Foreground string
|
|
SelectionBackground string
|
|
SelectionForeground string
|
|
CursorForeground string
|
|
CursorBackground string
|
|
}
|
|
|
|
func getThemePath() (string, error) {
|
|
return getPath("theme.yaml")
|
|
}
|
|
|
|
func loadTheme(themePath string) (*Theme, error) {
|
|
|
|
if themePath == "" {
|
|
var err error
|
|
themePath, err = getThemePath()
|
|
if err != nil {
|
|
return nil, fmt.Errorf("failed to locate theme path: %w", err)
|
|
}
|
|
}
|
|
|
|
if _, err := os.Stat(themePath); os.IsNotExist(err) {
|
|
return nil, &ErrorFileNotFound{Path: themePath}
|
|
}
|
|
|
|
themeData, err := ioutil.ReadFile(themePath)
|
|
if err != nil {
|
|
return nil, fmt.Errorf("failed to read theme file at '%s': %w", themePath, err)
|
|
}
|
|
|
|
theme := defaultTheme
|
|
if err := yaml.Unmarshal(themeData, &theme); err != nil {
|
|
return nil, fmt.Errorf("invalid theme file at '%s': %w", themePath, err)
|
|
}
|
|
|
|
return &theme, nil
|
|
}
|
|
|
|
func (t *Theme) Save() (string, error) {
|
|
themePath, err := getThemePath()
|
|
if err != nil {
|
|
return "", fmt.Errorf("failed to locate theme path: %w", err)
|
|
}
|
|
|
|
if err := os.MkdirAll(path.Dir(themePath), 0700); err != nil {
|
|
return "", err
|
|
}
|
|
|
|
data, err := yaml.Marshal(t)
|
|
if err != nil {
|
|
return "", err
|
|
}
|
|
|
|
return themePath, ioutil.WriteFile(themePath, data, 0600)
|
|
}
|