ini.go (1206B)
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 }