package ini import ( "bufio" "errors" "io" "iter" "strings" ) type Parser struct { Section string LineNumber int } type KeyVal struct { Key, Val string } func (p *Parser) Parse(r io.Reader) iter.Seq2[KeyVal, error] { return func(yield func(KeyVal, error) bool) { *p = Parser{} scanner := bufio.NewScanner(r) for scanner.Scan() { p.LineNumber++ line := strings.TrimSpace(scanner.Text()) if len(line) == 0 || strings.HasPrefix(line, "//") || strings.HasPrefix(line, ";") || strings.HasPrefix(line, "#") { continue } if strings.HasPrefix(line, "[") && strings.HasSuffix(line, "]") { p.Section = strings.TrimSpace(line[1 : len(line)-1]) continue } key, val, ok := strings.Cut(line, "=") if !ok { if !yield(KeyVal{}, errors.New("invalid key-value pair")) { return } continue } key, val = strings.TrimSpace(key), strings.TrimSpace(val) if !yield(KeyVal{key, val}, nil) { return } } if err := scanner.Err(); err != nil { yield(KeyVal{}, err) return } } }