Use XDG directories, and respect corresponding environment vars
This commit is contained in:
parent
a42dd60a16
commit
e60a990d10
@ -8,6 +8,29 @@ import "strconv"
|
|||||||
import "image/color"
|
import "image/color"
|
||||||
import "path/filepath"
|
import "path/filepath"
|
||||||
|
|
||||||
|
|
||||||
|
// when making changes to this file, look at
|
||||||
|
// https://specifications.freedesktop.org/basedir-spec/basedir-spec-latest.html
|
||||||
|
|
||||||
|
// Error represents an error that can be returned by functions or methods in
|
||||||
|
// this module.
|
||||||
|
type Error int
|
||||||
|
|
||||||
|
const (
|
||||||
|
// ErrorIllegalName is thrown when an application name contains illegal
|
||||||
|
// characters such as a slash.
|
||||||
|
ErrorIllegalName Error = iota
|
||||||
|
)
|
||||||
|
|
||||||
|
func (err Error) Error () (description string) {
|
||||||
|
switch err {
|
||||||
|
case ErrorIllegalName:
|
||||||
|
description = "name contains illegal characters"
|
||||||
|
}
|
||||||
|
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
// Type represents the data type of a configuration parameter.
|
// Type represents the data type of a configuration parameter.
|
||||||
type Type int
|
type Type int
|
||||||
|
|
||||||
@ -41,9 +64,15 @@ type Config struct {
|
|||||||
Parameters map[string] any
|
Parameters map[string] any
|
||||||
}
|
}
|
||||||
|
|
||||||
// Load loads and parses the files /etc/<name>/<name>.conf and
|
// Load loads and parses the files /etc/xdg/<name>/<name>.conf and
|
||||||
// <home>/.config/<name>/<name>.conf.
|
// <home>/.config/<name>/<name>.conf, unless the corresponding XDG environment
|
||||||
|
// variables are set - then it uses those.
|
||||||
func (config *Config) Load (name string) (err error) {
|
func (config *Config) Load (name string) (err error) {
|
||||||
|
if strings.ContainsAny(name, "/\\|:.%") {
|
||||||
|
err = ErrorIllegalName
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
if config.LegalParameters == nil {
|
if config.LegalParameters == nil {
|
||||||
config.LegalParameters = make(map[string] Type)
|
config.LegalParameters = make(map[string] Type)
|
||||||
}
|
}
|
||||||
@ -52,11 +81,27 @@ func (config *Config) Load (name string) (err error) {
|
|||||||
config.Parameters = make(map[string] any)
|
config.Parameters = make(map[string] any)
|
||||||
}
|
}
|
||||||
|
|
||||||
config.loadFile("/etc/" + name + "/" + name + ".conf")
|
|
||||||
var homeDirectory string
|
var homeDirectory string
|
||||||
homeDirectory, err = os.UserHomeDir()
|
homeDirectory, err = os.UserHomeDir()
|
||||||
if err != nil { return }
|
if err != nil { return }
|
||||||
config.loadFile(filepath.Join(homeDirectory, "/.config/" + name + "/" + name + ".conf"))
|
|
||||||
|
configHome := os.Getenv("XDG_CONFIG_HOME")
|
||||||
|
if configHome == "" {
|
||||||
|
configHome = filepath.Join(homeDirectory, "/.config/")
|
||||||
|
}
|
||||||
|
|
||||||
|
configDirsString := os.Getenv("XDG_CONFIG_DIRS")
|
||||||
|
if configDirsString == "" {
|
||||||
|
configDirsString = "/etc/xdg/"
|
||||||
|
}
|
||||||
|
|
||||||
|
configDirs := strings.Split(configDirsString, ":")
|
||||||
|
configDirs = append(configDirs, configHome)
|
||||||
|
|
||||||
|
for _, directory := range configDirs {
|
||||||
|
config.loadFile(filepath.Join(directory, name, name + ".conf"))
|
||||||
|
}
|
||||||
|
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user