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…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user