Skip to content

Commit

Permalink
support pointer-to-slice
Browse files Browse the repository at this point in the history
  • Loading branch information
speter committed Jan 3, 2016
1 parent a3bc074 commit 083575c
Show file tree
Hide file tree
Showing 2 changed files with 15 additions and 5 deletions.
11 changes: 7 additions & 4 deletions read_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -69,7 +69,7 @@ type cMulti struct {
}
type cMultiS1 struct{ Multi []string }
type cMultiS2 struct{ NonMulti nonMulti }
type cMultiS3 struct{ MultiInt []int }
type cMultiS3 struct{ PMulti *[]string }

type cSubs struct{ Sub map[string]*cSubsS1 }
type cSubsS1 struct{ Name string }
Expand Down Expand Up @@ -101,9 +101,8 @@ type readtest struct {
ok bool
}

func newString(s string) *string {
return &s
}
func newString(s string) *string { return &s }
func newStringSlice(s ...string) *[]string { return &s }

var readtests = []struct {
group string
Expand Down Expand Up @@ -188,6 +187,10 @@ var readtests = []struct {
// pointer
{"[section]", &cBasic{Section: cBasicS1{PName: nil}}, true},
{"[section]\npname=value", &cBasic{Section: cBasicS1{PName: newString("value")}}, true},
{"[m3]", &cMulti{M3: cMultiS3{PMulti: nil}}, true},
{"[m3]\npmulti", &cMulti{M3: cMultiS3{PMulti: newStringSlice()}}, true},
{"[m3]\npmulti=value", &cMulti{M3: cMultiS3{PMulti: newStringSlice("value")}}, true},
{"[m3]\npmulti=value1\npmulti=value2", &cMulti{M3: cMultiS3{PMulti: newStringSlice("value1", "value2")}}, true},
// section name not matched
{"\n[nonexistent]\nname=value", &cBasic{}, false},
// subsection name not matched
Expand Down
9 changes: 8 additions & 1 deletion set.go
Original file line number Diff line number Diff line change
Expand Up @@ -238,7 +238,14 @@ func set(cfg interface{}, sect, sub, name string, blank bool, value string) erro
// vVal is either single-valued var, or newly allocated value within multi-valued var
var vVal reflect.Value
// multi-value if unnamed slice type
isMulti := vVar.Type().Name() == "" && vVar.Kind() == reflect.Slice
isMulti := vVar.Type().Name() == "" && vVar.Kind() == reflect.Slice ||
vVar.Type().Name() == "" && vVar.Kind() == reflect.Ptr && vVar.Type().Elem().Name() == "" && vVar.Type().Elem().Kind() == reflect.Slice
if isMulti && vVar.Kind() == reflect.Ptr {
if vVar.IsNil() {
vVar.Set(reflect.New(vVar.Type().Elem()))
}
vVar = vVar.Elem()
}
if isMulti && blank {
vVar.Set(reflect.Zero(vVar.Type()))
return nil
Expand Down

0 comments on commit 083575c

Please sign in to comment.