Tidy up parsing API

This commit is contained in:
kayomn 2022-12-20 21:48:24 +00:00
parent 7b7ad2e791
commit 7cd6ac1c51
2 changed files with 18 additions and 8 deletions

17
ini.go
View File

@ -18,10 +18,17 @@ func (parser *Parser) Err() error {
return parser.err
}
// Returns `true` if `parser` has reached the end of parsable tokens, either because the stream has
// ended or it has encountered an error.
func (parser *Parser) IsEnd() bool {
return parser.isEnd
}
// Creates and returns a new [Parser] by reference from `reader`
func NewParser(reader io.Reader) *Parser {
return &Parser{
scanner: bufio.NewScanner(reader),
isEnd: false,
}
}
@ -31,7 +38,7 @@ func NewParser(reader io.Reader) *Parser {
//
// Note that the `parser` does not guarantee any parse order for key-value pairs extracted from the
// `parser` stream.
func (parser *Parser) Parse() (Entry, bool) {
func (parser *Parser) Parse() Entry {
for parser.scanner.Scan() {
var line = strings.TrimSpace(parser.scanner.Text())
var lineLen = len(line)
@ -72,7 +79,7 @@ func (parser *Parser) Parse() (Entry, bool) {
Section: parser.section,
Key: strings.TrimSpace(line[0:assignmentIndex]),
Value: value,
}, true
}
}
// Key which is its own value.
@ -82,12 +89,13 @@ func (parser *Parser) Parse() (Entry, bool) {
Section: parser.section,
Key: keyValue,
Value: keyValue,
}, true
}
}
parser.err = parser.scanner.Err()
parser.isEnd = true
return Entry{}, false
return Entry{}
}
// State machine for parsing streamable INI file sources.
@ -95,4 +103,5 @@ type Parser struct {
scanner *bufio.Scanner
err error
section string
isEnd bool
}

View File

@ -3,9 +3,9 @@
Unsatisfied with the INI parsing tools provided by third-parties in the Golang ecosystem, INI Gusher aims to solve parsing and saving of INI files as simply as possible.
```go
var iniParser = ini.NewParser(modInfoFile)
var parser = ini.NewParser(modInfoFile)
for entry, parsed := iniParser.Parse(); parsed; entry, parsed = iniParser.Parse() {
for entry, parsed := parser.Parse(); parsed; entry, parsed = parser.Parse() {
var myValue = myValueMap[entry.Section]
switch entry.Key {
@ -22,7 +22,7 @@ for entry, parsed := iniParser.Parse(); parsed; entry, parsed = iniParser.Parse(
myValueMap[entry.Section] = myValue
}
if err := iniParser.Err(); err != nil {
if err := parser.Err(); err != nil {
return err
}
```
@ -39,6 +39,7 @@ As with Golang itself, INI Gusher is fairly opinionated; The API uses incrementa
* Unquoted keys may only use alphanumerics of any case.
* Unquoted values may only use alphanumerics of any case and whitespace is only acknowledged if it is between them.
* Keys and values may be surrounded in double-quotes (`"`) to preseve trailing whitespace and allow all characters.
* Sections allow all characters between their opening and closing braces (`"[]"`).
* Whitespace is ignored everywhere else.
* The default section is an empty string (`""`).