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 (`""`).
@ -46,4 +47,4 @@ If the above design goals suit your use-case then INI Gusher is for you.
## What is Up with the Name?
Most Golang libraries use some sort of word starting with "G" in their name and this was my attempt to follow the styleguide laid out before me.
Most Golang libraries use some sort of word starting with "G" in their name and this was my attempt to follow the styleguide laid out before me.