From 7cd6ac1c51c5ca61e07f190f08ff58ad437c6525 Mon Sep 17 00:00:00 2001 From: kayomn Date: Tue, 20 Dec 2022 21:48:24 +0000 Subject: [PATCH] Tidy up parsing API --- ini.go | 17 +++++++++++++---- readme.md | 9 +++++---- 2 files changed, 18 insertions(+), 8 deletions(-) diff --git a/ini.go b/ini.go index 5166836..c82374b 100644 --- a/ini.go +++ b/ini.go @@ -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 } diff --git a/readme.md b/readme.md index 4f373a3..b5e2024 100644 --- a/readme.md +++ b/readme.md @@ -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. \ No newline at end of file +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.