Key/value parsing always checks group integrity
This commit is contained in:
parent
8b4f77b223
commit
e9ff323f69
@ -64,6 +64,18 @@ func Parse (reader io.Reader) (File, error) {
|
|||||||
var file = File { }
|
var file = File { }
|
||||||
var group Group
|
var group Group
|
||||||
var specifiedValues map[string] struct { }
|
var specifiedValues map[string] struct { }
|
||||||
|
|
||||||
|
checkGroupIntegrity := func () error {
|
||||||
|
if group != nil {
|
||||||
|
for key := range group {
|
||||||
|
if _, ok := specifiedValues[key]; !ok {
|
||||||
|
return ErrNoDefaultValue
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
for {
|
for {
|
||||||
line, err := buffer.ReadString('\n')
|
line, err := buffer.ReadString('\n')
|
||||||
if errors.Is(err, io.EOF) { break }
|
if errors.Is(err, io.EOF) { break }
|
||||||
@ -78,13 +90,8 @@ func Parse (reader io.Reader) (File, error) {
|
|||||||
// group header
|
// group header
|
||||||
case strings.HasPrefix(line, "["):
|
case strings.HasPrefix(line, "["):
|
||||||
// check integrity of prev. group
|
// check integrity of prev. group
|
||||||
if group != nil {
|
err := checkGroupIntegrity()
|
||||||
for key := range group {
|
if err != nil { return File { }, err }
|
||||||
if _, ok := specifiedValues[key]; !ok {
|
|
||||||
return nil, ErrNoDefaultValue
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// create new group
|
// create new group
|
||||||
name, err := parseGroupHeader(line)
|
name, err := parseGroupHeader(line)
|
||||||
@ -122,6 +129,9 @@ func Parse (reader io.Reader) (File, error) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
err := checkGroupIntegrity()
|
||||||
|
if err != nil { return File { }, err }
|
||||||
|
|
||||||
return file, nil
|
return file, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -52,6 +52,15 @@ func testParseString (test *testing.T, input string, correct File) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func testParseErr (test *testing.T, input string, correct error) {
|
||||||
|
_, err := Parse(strings.NewReader(input))
|
||||||
|
if err != correct {
|
||||||
|
test.Fatalf (
|
||||||
|
"errors are different\n---correct---\n%v\n---got---\n%v\n",
|
||||||
|
err, correct)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
func testEntry (value string) Entry {
|
func testEntry (value string) Entry {
|
||||||
entry := newEntry()
|
entry := newEntry()
|
||||||
entry.Value = value
|
entry.Value = value
|
||||||
@ -222,3 +231,12 @@ File {
|
|||||||
},
|
},
|
||||||
},
|
},
|
||||||
})}
|
})}
|
||||||
|
|
||||||
|
func TestParseErrNoDefaultValue (test *testing.T) {
|
||||||
|
testParseErr(test, `
|
||||||
|
[Group 0]
|
||||||
|
Name[xx_XX]=other thing
|
||||||
|
Name[yy_YY]=another thing
|
||||||
|
Name[zz_ZZ]=yet another thing
|
||||||
|
`, ErrNoDefaultValue)
|
||||||
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user