ini.go raw

   1  // Package ini implements parsing of the AWS shared config file.
   2  //
   3  //	Example:
   4  //	sections, err := ini.OpenFile("/path/to/file")
   5  //	if err != nil {
   6  //		panic(err)
   7  //	}
   8  //
   9  //	profile := "foo"
  10  //	section, ok := sections.GetSection(profile)
  11  //	if !ok {
  12  //		fmt.Printf("section %q could not be found", profile)
  13  //	}
  14  package ini
  15  
  16  import (
  17  	"fmt"
  18  	"io"
  19  	"os"
  20  	"strings"
  21  )
  22  
  23  // OpenFile parses shared config from the given file path.
  24  func OpenFile(path string) (sections Sections, err error) {
  25  	f, oerr := os.Open(path)
  26  	if oerr != nil {
  27  		return Sections{}, &UnableToReadFile{Err: oerr}
  28  	}
  29  
  30  	defer func() {
  31  		closeErr := f.Close()
  32  		if err == nil {
  33  			err = closeErr
  34  		} else if closeErr != nil {
  35  			err = fmt.Errorf("close error: %v, original error: %w", closeErr, err)
  36  		}
  37  	}()
  38  
  39  	return Parse(f, path)
  40  }
  41  
  42  // Parse parses shared config from the given reader.
  43  func Parse(r io.Reader, path string) (Sections, error) {
  44  	contents, err := io.ReadAll(r)
  45  	if err != nil {
  46  		return Sections{}, fmt.Errorf("read all: %v", err)
  47  	}
  48  
  49  	lines := strings.Split(string(contents), "\n")
  50  	tokens, err := tokenize(lines)
  51  	if err != nil {
  52  		return Sections{}, fmt.Errorf("tokenize: %v", err)
  53  	}
  54  
  55  	return parse(tokens, path), nil
  56  }
  57