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 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` // Creates and returns a new [Parser] by reference from `reader`
func NewParser(reader io.Reader) *Parser { func NewParser(reader io.Reader) *Parser {
return &Parser{ return &Parser{
scanner: bufio.NewScanner(reader), 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 // Note that the `parser` does not guarantee any parse order for key-value pairs extracted from the
// `parser` stream. // `parser` stream.
func (parser *Parser) Parse() (Entry, bool) { func (parser *Parser) Parse() Entry {
for parser.scanner.Scan() { for parser.scanner.Scan() {
var line = strings.TrimSpace(parser.scanner.Text()) var line = strings.TrimSpace(parser.scanner.Text())
var lineLen = len(line) var lineLen = len(line)
@ -72,7 +79,7 @@ func (parser *Parser) Parse() (Entry, bool) {
Section: parser.section, Section: parser.section,
Key: strings.TrimSpace(line[0:assignmentIndex]), Key: strings.TrimSpace(line[0:assignmentIndex]),
Value: value, Value: value,
}, true }
} }
// Key which is its own value. // Key which is its own value.
@ -82,12 +89,13 @@ func (parser *Parser) Parse() (Entry, bool) {
Section: parser.section, Section: parser.section,
Key: keyValue, Key: keyValue,
Value: keyValue, Value: keyValue,
}, true }
} }
parser.err = parser.scanner.Err() parser.err = parser.scanner.Err()
parser.isEnd = true
return Entry{}, false return Entry{}
} }
// State machine for parsing streamable INI file sources. // State machine for parsing streamable INI file sources.
@ -95,4 +103,5 @@ type Parser struct {
scanner *bufio.Scanner scanner *bufio.Scanner
err error err error
section string 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. 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 ```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] var myValue = myValueMap[entry.Section]
switch entry.Key { switch entry.Key {
@ -22,7 +22,7 @@ for entry, parsed := iniParser.Parse(); parsed; entry, parsed = iniParser.Parse(
myValueMap[entry.Section] = myValue myValueMap[entry.Section] = myValue
} }
if err := iniParser.Err(); err != nil { if err := parser.Err(); err != nil {
return err 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 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. * 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. * 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. * Whitespace is ignored everywhere else.
* The default section is an empty string (`""`). * 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? ## 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.