ini.go 1.3 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465
  1. package ini
  2. import (
  3. "strings"
  4. "io/ioutil"
  5. )
  6. type Callback func(fileName string, line int, section string,
  7. key string, value string, data interface{}) error
  8. func Parse(ini string, cb Callback, data interface{}) error {
  9. return parse("", ini, cb, data)
  10. }
  11. func ParseFile(fileName string, cb Callback, data interface{}) error {
  12. file, err := ioutil.ReadFile(fileName)
  13. if err != nil {
  14. return cb(fileName, -1, err.Error(), "", "", data)
  15. }
  16. return parse(fileName, string(file), cb, data)
  17. }
  18. func parse(fileName string, ini string, cb Callback, data interface{}) error {
  19. lines := strings.Split(ini, "\n")
  20. header := ""
  21. for n, line := range lines {
  22. line = strings.TrimSpace(line)
  23. if len(line) == 0 || strings.HasPrefix(line, "#") {
  24. continue
  25. }
  26. if strings.HasPrefix(line, "[") && strings.HasSuffix(line, "]") {
  27. runes := []rune(line)
  28. header = string(runes[1 : len(runes)-1])
  29. if err := cb(fileName, n, header, "", "", data); err != nil {
  30. return err
  31. }
  32. continue
  33. }
  34. key, value := splitPair(line)
  35. if err := cb(fileName, n, header, key, value, data); err != nil {
  36. return err
  37. }
  38. }
  39. return nil
  40. }
  41. func splitPair(line string) (string, string) {
  42. split := strings.SplitN(line, "=", 2)
  43. key := strings.TrimSpace(split[0])
  44. if len(split) == 1 {
  45. return key, ""
  46. }
  47. value := strings.TrimSpace(split[1])
  48. return key, value
  49. }