Package ingrid parses .ini files.
§ Quickstart
$ go get -u sogvin.com/ingrid
§ Features
The format is often used in .ini, .conf or .cfg files. This
implementation is focused on performance and comes with minor
limitations.
- comments start with # or ;
- values may be quoted using ", ` (backtick), or ' (single tick)
- sections start with [ and end with ]
- spaces before and after key, values are removed
§ Limitations
Currently the limitations for this implementation are
- no spaces in keys
- no comments after a key value pair
- no multiline values
§ Example
package ingrid_test
import (
"bufio"
"errors"
"fmt"
"strings"
"sogvin.com/ingrid"
)
func Example() {
input := `# generic things
debug = false
# default for servers
bind= localhost:80
[example]
text = "escaped \""
hostname = "example.com"
more = 'single "quoted" string'
[github]
hostname=github.com
bind=localhost:443
empty=
# invalid lines
color
my name = john
[trouble
text='...
`
mapping := func(section, key, value, comment string, err error) {
switch {
case errors.Is(err, ingrid.ErrSyntax):
fmt.Printf("input line:%v\n", err)
case key != "":
fmt.Printf("%s%s=%s\n", prefix(section), key, value)
}
}
ingrid.Map(mapping, bufio.NewScanner(strings.NewReader(input)))
// output:
// debug=false
// bind=localhost:80
// example.text=escaped "
// example.hostname=example.com
// example.more=single "quoted" string
// github.hostname=github.com
// github.bind=localhost:443
// github.empty=
// input line:17 color SYNTAX ERROR: missing equal sign
// input line:18 my name = john SYNTAX ERROR: space not allowed in key
// input line:19 [trouble SYNTAX ERROR: missing right bracket
// input line:20 text='... SYNTAX ERROR: missing end quote
}
// prefix returns section. if not empty.
func prefix(section string) string {
if len(section) == 0 {
return ""
}
return section + "."
}
§ Benchmark
goos: linux
goarch: amd64
pkg: github.com/gregoryv/ingrid
cpu: Intel(R) Xeon(R) E-2288G CPU @ 3.70GHz
Benchmark_Map-16 155987371 7.672 ns/op 0 B/op 0 allocs/op