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 }