summaryrefslogtreecommitdiffstats
path: root/internal/ini/ini.go
blob: c546a527f635a71d0467651d69954d5d8d08adfa (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
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
		}
	}
}