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
}
}
}
|