Clear slice and map option values before set the first time
Fixes #121.
diff --git a/ini_test.go b/ini_test.go
index aa3b556..c0073e7 100644
--- a/ini_test.go
+++ b/ini_test.go
@@ -672,6 +672,54 @@
}
}
+func TestIniCliOverrides(t *testing.T) {
+ file, err := ioutil.TempFile("", "")
+
+ if err != nil {
+ t.Fatalf("Cannot create temporary file: %s", err)
+ }
+
+ defer os.Remove(file.Name())
+
+ _, err = file.WriteString("values = 123\n")
+ _, err = file.WriteString("values = 456\n")
+
+ if err != nil {
+ t.Fatalf("Cannot write to temporary file: %s", err)
+ }
+
+ file.Close()
+
+ var opts struct {
+ Values []int `long:"values"`
+ }
+
+ p := NewParser(&opts, Default)
+ err = NewIniParser(p).ParseFile(file.Name())
+
+ if err != nil {
+ t.Fatalf("Could not parse ini: %s", err)
+ }
+
+ _, err = p.ParseArgs([]string{"--values", "111", "--values", "222"})
+
+ if err != nil {
+ t.Fatalf("Failed to parse arguments: %s", err)
+ }
+
+ if len(opts.Values) != 2 {
+ t.Fatalf("Expected Values to contain two elements, but got %d", len(opts.Values))
+ }
+
+ if opts.Values[0] != 111 {
+ t.Fatalf("Expected Values[0] to be 111, but got '%d'", opts.Values[0])
+ }
+
+ if opts.Values[1] != 222 {
+ t.Fatalf("Expected Values[0] to be 222, but got '%d'", opts.Values[1])
+ }
+}
+
func TestWriteFile(t *testing.T) {
file, err := ioutil.TempFile("", "")
if err != nil {
diff --git a/option_private.go b/option_private.go
index ab63ba2..444334e 100644
--- a/option_private.go
+++ b/option_private.go
@@ -10,6 +10,12 @@
// if the specified value could not be converted to the corresponding option
// value type.
func (option *Option) set(value *string) error {
+ kind := option.value.Type().Kind()
+
+ if (kind == reflect.Map || kind == reflect.Slice) && !option.isSet {
+ option.empty()
+ }
+
option.isSet = true
if len(option.Choices) != 0 {