Compare commits

..

No commits in common. "ca863af9c4a3809044611218e8f6cd2ecae9ae39" and "7b7ad2e7910f14b261d50a750337fc8aeab59063" have entirely different histories.

2 changed files with 22 additions and 36 deletions

49
ini.go
View File

@ -18,17 +18,10 @@ 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,
}
}
@ -38,7 +31,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 {
func (parser *Parser) Parse() (Entry, bool) {
for parser.scanner.Scan() {
var line = strings.TrimSpace(parser.scanner.Text())
var lineLen = len(line)
@ -64,27 +57,37 @@ func (parser *Parser) Parse() Entry {
if assignmentIndex := strings.Index(line, "="); assignmentIndex > -1 {
// Key with value.
var value = strings.TrimSpace(line[assignmentIndex+1:])
var valueLen = len(value)
if valueLen != 0 {
var valueTail = len(value) - 1
if (value[0] == '"') && (value[valueTail] == '"') {
value = value[1:valueTail]
}
}
return Entry{
Section: parser.section,
Key: unquote(strings.TrimSpace(line[0:assignmentIndex])),
Value: unquote(strings.TrimSpace(line[assignmentIndex+1:])),
}
Key: strings.TrimSpace(line[0:assignmentIndex]),
Value: value,
}, true
}
// Key which is its own value.
var keyValue = unquote(line[1:lineTail])
var keyValue = line[1:lineTail]
return Entry{
Section: parser.section,
Key: keyValue,
Value: keyValue,
}
}, true
}
parser.err = parser.scanner.Err()
parser.isEnd = true
return Entry{}
return Entry{}, false
}
// State machine for parsing streamable INI file sources.
@ -92,20 +95,4 @@ type Parser struct {
scanner *bufio.Scanner
err error
section string
isEnd bool
}
// Returns a string with the the outer-most quotes surrounding `s` trimmed, should they exist.
func unquote(s string) string {
var sLen = len(s)
if sLen != 0 {
var sTail = sLen - 1
if (s[0] == '"') && (s[sTail] == '"') {
return s[1:sTail]
}
}
return s
}

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 parser = ini.NewParser(modInfoFile)
var iniParser = ini.NewParser(modInfoFile)
for entry, parsed := parser.Parse(); parsed; entry, parsed = parser.Parse() {
for entry, parsed := iniParser.Parse(); parsed; entry, parsed = iniParser.Parse() {
var myValue = myValueMap[entry.Section]
switch entry.Key {
@ -22,7 +22,7 @@ for entry, parsed := parser.Parse(); parsed; entry, parsed = parser.Parse() {
myValueMap[entry.Section] = myValue
}
if err := parser.Err(); err != nil {
if err := iniParser.Err(); err != nil {
return err
}
```
@ -39,7 +39,6 @@ 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 (`""`).
@ -47,4 +46,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.