key: add AllowDuplicateShadowValues option (#298)

This commit is contained in:
Drayton Munster
2021-09-07 11:41:39 +08:00
committed by GitHub
parent b52868c71b
commit 326d24fbbe
3 changed files with 33 additions and 6 deletions
+2
View File
@@ -125,6 +125,8 @@ type LoadOptions struct {
ReaderBufferSize int
// AllowNonUniqueSections indicates whether to allow sections with the same name multiple times.
AllowNonUniqueSections bool
// AllowDuplicateShadowValues indicates whether values for shadowed keys should be deduplicated.
AllowDuplicateShadowValues bool
}
// DebugFunc is the type of function called to log parse events.
+2
View File
@@ -54,6 +54,7 @@ func (k *Key) addShadow(val string) error {
return errors.New("cannot add shadow to auto-increment or boolean key")
}
if !k.s.f.options.AllowDuplicateShadowValues {
// Deduplicate shadows based on their values.
if k.value == val {
return nil
@@ -63,6 +64,7 @@ func (k *Key) addShadow(val string) error {
return nil
}
}
}
shadow := newKey(k.s, k.name, val)
shadow.isShadow = true
+23
View File
@@ -51,6 +51,29 @@ func TestKey_AddShadow(t *testing.T) {
Convey("Add shadow to auto-increment key", func() {
So(f.Section("notes").Key("#1").AddShadow("beta"), ShouldNotBeNil)
})
Convey("Deduplicate an existing value", func() {
k := f.Section("").Key("NAME")
So(k.AddShadow("ini"), ShouldBeNil)
So(k.ValueWithShadows(), ShouldResemble, []string{"ini", "ini.v1"})
})
})
Convey("Allow duplicate shadowed values", t, func() {
f := ini.Empty(ini.LoadOptions{
AllowShadows: true,
AllowDuplicateShadowValues: true,
})
So(f, ShouldNotBeNil)
k, err := f.Section("").NewKey("NAME", "ini")
So(err, ShouldBeNil)
So(k, ShouldNotBeNil)
So(k.AddShadow("ini.v1"), ShouldBeNil)
So(k.AddShadow("ini"), ShouldBeNil)
So(k.AddShadow("ini"), ShouldBeNil)
So(k.ValueWithShadows(), ShouldResemble, []string{"ini", "ini.v1", "ini", "ini"})
})
Convey("Shadow is not allowed", t, func() {