ini.go 1.1 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758
  1. package ini
  2. import (
  3. "fmt"
  4. "io"
  5. "os"
  6. )
  7. // OpenFile takes a path to a given file, and will open and parse
  8. // that file.
  9. func OpenFile(path string) (sections Sections, err error) {
  10. f, oerr := os.Open(path)
  11. if oerr != nil {
  12. return Sections{}, &UnableToReadFile{Err: oerr}
  13. }
  14. defer func() {
  15. closeErr := f.Close()
  16. if err == nil {
  17. err = closeErr
  18. } else if closeErr != nil {
  19. err = fmt.Errorf("close error: %v, original error: %w", closeErr, err)
  20. }
  21. }()
  22. return Parse(f, path)
  23. }
  24. // Parse will parse the given file using the shared config
  25. // visitor.
  26. func Parse(f io.Reader, path string) (Sections, error) {
  27. tree, err := ParseAST(f)
  28. if err != nil {
  29. return Sections{}, err
  30. }
  31. v := NewDefaultVisitor(path)
  32. if err = Walk(tree, v); err != nil {
  33. return Sections{}, err
  34. }
  35. return v.Sections, nil
  36. }
  37. // ParseBytes will parse the given bytes and return the parsed sections.
  38. func ParseBytes(b []byte) (Sections, error) {
  39. tree, err := ParseASTBytes(b)
  40. if err != nil {
  41. return Sections{}, err
  42. }
  43. v := NewDefaultVisitor("")
  44. if err = Walk(tree, v); err != nil {
  45. return Sections{}, err
  46. }
  47. return v.Sections, nil
  48. }