From d6f4fd0834ec787c82082e31de6186aad400e17d Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Carlos=20Henrique=20Guard=C3=A3o=20Gandarez?=
Date: Mon, 30 May 2022 18:09:58 -0300
Subject: [PATCH 1/2] Fix line skipping when key is empty
---
ini_test.go | 2 ++
parser.go | 2 +-
2 files changed, 3 insertions(+), 1 deletion(-)
diff --git a/ini_test.go b/ini_test.go
index 8a21eae..96e06b1 100644
--- a/ini_test.go
+++ b/ini_test.go
@@ -445,6 +445,8 @@ BiomeRarityScale: 100
BiomeGroup(NormalBiomes, 3, 99, RoofedForestEnchanted, ForestSakura, FloatingJungle
BiomeGroup(IceBiomes, 4, 85, Ice Plains)
+
+= RainForest
`))
require.NoError(t, err)
require.NotNil(t, f)
diff --git a/parser.go b/parser.go
index ca76f5f..6629f78 100644
--- a/parser.go
+++ b/parser.go
@@ -161,7 +161,7 @@ func readKeyName(delimiters string, in []byte) (string, int, error) {
}
endIdx = strings.IndexAny(line, delimiters)
- if endIdx < 0 {
+ if endIdx <= 0 {
return "", -1, ErrDelimiterNotFound{line}
}
return strings.TrimSpace(line[0:endIdx]), endIdx + 1, nil
From a5af1b5416f35830630eedc97d64e6df4ba135df Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Carlos=20Henrique=20Guard=C3=A3o=20Gandarez?=
Date: Mon, 30 May 2022 19:25:30 -0300
Subject: [PATCH 2/2] fixup! Fix line skipping when key is empty
---
error.go | 15 +++++++++++++++
parser.go | 11 +++++++++--
2 files changed, 24 insertions(+), 2 deletions(-)
diff --git a/error.go b/error.go
index d88347c..f66bc94 100644
--- a/error.go
+++ b/error.go
@@ -32,3 +32,18 @@ func IsErrDelimiterNotFound(err error) bool {
func (err ErrDelimiterNotFound) Error() string {
return fmt.Sprintf("key-value delimiter not found: %s", err.Line)
}
+
+// ErrEmptyKeyName indicates the error type of no key name is found which there should be one.
+type ErrEmptyKeyName struct {
+ Line string
+}
+
+// IsErrEmptyKeyName returns true if the given error is an instance of ErrEmptyKeyName.
+func IsErrEmptyKeyName(err error) bool {
+ _, ok := err.(ErrEmptyKeyName)
+ return ok
+}
+
+func (err ErrEmptyKeyName) Error() string {
+ return fmt.Sprintf("empty key name: %s", err.Line)
+}
diff --git a/parser.go b/parser.go
index 6629f78..9429a33 100644
--- a/parser.go
+++ b/parser.go
@@ -161,9 +161,13 @@ func readKeyName(delimiters string, in []byte) (string, int, error) {
}
endIdx = strings.IndexAny(line, delimiters)
- if endIdx <= 0 {
+ if endIdx < 0 {
return "", -1, ErrDelimiterNotFound{line}
}
+ if endIdx == 0 {
+ return "", -1, ErrEmptyKeyName{line}
+ }
+
return strings.TrimSpace(line[0:endIdx]), endIdx + 1, nil
}
@@ -466,8 +470,9 @@ func (f *File) parse(reader io.Reader) (err error) {
kname, offset, err := readKeyName(f.options.KeyValueDelimiters, line)
if err != nil {
+ switch {
// Treat as boolean key when desired, and whole line is key name.
- if IsErrDelimiterNotFound(err) {
+ case IsErrDelimiterNotFound(err):
switch {
case f.options.AllowBooleanKeys:
kname, err := p.readValue(line, parserBufferSize)
@@ -485,6 +490,8 @@ func (f *File) parse(reader io.Reader) (err error) {
case f.options.SkipUnrecognizableLines:
continue
}
+ case IsErrEmptyKeyName(err) && f.options.SkipUnrecognizableLines:
+ continue
}
return err
}