diff options
| -rw-r--r-- | simpleconf.go | 40 | 
1 files changed, 40 insertions, 0 deletions
| diff --git a/simpleconf.go b/simpleconf.go index ad13f11..3dd6ef6 100644 --- a/simpleconf.go +++ b/simpleconf.go @@ -1,3 +1,27 @@ +// Package simpleconf implements a parser for a very simple configuration file format. +// +// The format is inspired by INI files. A file consists of lines. A line is one of: +// +// Comment: The Line starts with an '#', or an ';'. Comments can only be on their own line. +// +// Section header: A section header names the current section. The Section named is wrapped in '[' and ']'. +// Section names must not be empty. +// +// Key-Value Pair: A value assigned to a key. The pair must belong to a section. +// Key and value are separated by '='. Everything after the '=' is the value. +// Keys must not be empty. +// Leading and trailing whitespace in key and value will be deleted. +// +// Example: +// +// 	[foo] +// 	test = Hello, World! +// 	answer = 42 +// +// 	; I am a comment. +// 	# I am also a comment +// 	[bar] +// 	trololo = bla.. ; I am NOT A comment, I belong to value bar.trololo!  package simpleconf  import ( @@ -10,6 +34,7 @@ import (  	"strings"  ) +// Config contains a loaded config file. You can access the values by simply using the map or by using the `Get...` functions.  type Config map[string]Section  type Section map[string]string @@ -19,6 +44,10 @@ func (c Config) addSection(section Section, name string) {  	}  } +// Load loads a config file. See package description for the file format. +// +// If outerr != nil, either an I/O error occurred, or the file was not a valid config file. +// In both cases, the error will describe what went wrong.  func Load(r io.Reader) (config Config, outerr error) {  	config = make(Config)  	scanner := bufio.NewScanner(r) @@ -78,11 +107,13 @@ func Load(r io.Reader) (config Config, outerr error) {  	return  } +// Errors of the `Get...` functions.  var (  	NotFound = errors.New("Section or key not found.")  	NotBool  = errors.New("Could not interpret value as bool.")  ) +// GetString gets the string assigned to [section] key. It will return NotFound, if no such key exists.  func (c Config) GetString(section, key string) (string, error) {  	s, ok := c[section]  	if !ok { @@ -95,6 +126,7 @@ func (c Config) GetString(section, key string) (string, error) {  	return rv, nil  } +// GetStringDefault is like GetString, but will return d, if the key was not found.  func (c Config) GetStringDefault(d, section, key string) (string, error) {  	rv, err := c.GetString(section, key)  	if err == NotFound { @@ -103,6 +135,7 @@ func (c Config) GetStringDefault(d, section, key string) (string, error) {  	return rv, err  } +// GetInt is like GetString, but will additionally parse the value as an integer. See strconv.ParseInt for possible errors.  func (c Config) GetInt(section, key string) (int64, error) {  	s, err := c.GetString(section, key)  	if err != nil { @@ -119,6 +152,7 @@ func (c Config) GetIntDefault(d int64, section, key string) (int64, error) {  	return rv, err  } +// GetFloat is like GetString, but will additionally parse the value as a float. See strconv.ParseFloat for possible errors.  func (c Config) GetFloat(section, key string) (float64, error) {  	s, err := c.GetString(section, key)  	if err != nil { @@ -135,6 +169,9 @@ func (c Config) GetFloatDefault(d float64, section, key string) (float64, error)  	return rv, err  } +// GetBool is like GetString, but will additionally parse the value as a boolean value. +// +// true, on, yes, y and 1 are all true, false, off, no, n, 0 are all false. Other values will result in a NotBool error.  func (c Config) GetBool(section, key string) (bool, error) {  	s, err := c.GetString(section, key)  	if err != nil { @@ -158,6 +195,8 @@ func (c Config) GetBoolDefault(d bool, section, key string) (bool, error) {  	return rv, err  } +// GetFile is like GetString, but will additionally open the file with that name. +// See os.OpenFile for flag and perm values and additional error values.  func (c Config) GetFile(flag int, perm os.FileMode, section, key string) (*os.File, error) {  	s, err := c.GetString(section, key)  	if err != nil { @@ -167,6 +206,7 @@ func (c Config) GetFile(flag int, perm os.FileMode, section, key string) (*os.Fi  	return os.OpenFile(s, flag, perm)  } +// GetFileReadonly is like GetFile, but with default values for flag and perm that will open the file in read-only mode.  func (c Config) GetFileReadonly(section, key string) (*os.File, error) {  	return c.GetFile(os.O_RDONLY, 0, section, key)  } | 
