1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465 |
- package ini
- import (
- "strings"
- "io/ioutil"
- )
- type Callback func(fileName string, line int, section string,
- key string, value string, data interface{}) error
- func Parse(ini string, cb Callback, data interface{}) error {
- return parse("", ini, cb, data)
- }
- func ParseFile(fileName string, cb Callback, data interface{}) error {
- file, err := ioutil.ReadFile(fileName)
- if err != nil {
- return cb(fileName, -1, err.Error(), "", "", data)
- }
- return parse(fileName, string(file), cb, data)
- }
- func parse(fileName string, ini string, cb Callback, data interface{}) error {
- lines := strings.Split(ini, "\n")
- header := ""
- for n, line := range lines {
- line = strings.TrimSpace(line)
- if len(line) == 0 || strings.HasPrefix(line, "#") {
- continue
- }
- if strings.HasPrefix(line, "[") && strings.HasSuffix(line, "]") {
- runes := []rune(line)
- header = string(runes[1 : len(runes)-1])
-
- if err := cb(fileName, n, header, "", "", data); err != nil {
- return err
- }
- continue
- }
- key, value := splitPair(line)
- if err := cb(fileName, n, header, key, value, data); err != nil {
- return err
- }
- }
- return nil
- }
- func splitPair(line string) (string, string) {
- split := strings.SplitN(line, "=", 2)
- key := strings.TrimSpace(split[0])
- if len(split) == 1 {
- return key, ""
- }
- value := strings.TrimSpace(split[1])
- return key, value
- }
|