diff --git a/cflag/ext.go b/cflag/ext.go index 7287838a2..25d8e702f 100644 --- a/cflag/ext.go +++ b/cflag/ext.go @@ -255,6 +255,13 @@ func (s *String) Ints(sep string) []int { // // Implemented the flag.Value interface. // +// Usage: +// +// type myOpts struct { +// vars cflag.KVString +// } +// var mo &myOpts{ vars: cflag.NewKVString() } +// // Example: // // --var name=inhere => string map {name:inhere} @@ -266,10 +273,16 @@ type KVString struct { // NewKVString instance func NewKVString() KVString { - return KVString{ - Sep: comdef.EqualStr, - SMap: make(maputil.SMap), + return *(&KVString{}).Init() +} + +// Init settings +func (s *KVString) Init() *KVString { + if s.Sep == "" { + s.Sep = comdef.EqualStr + s.SMap = make(maputil.SMap) } + return s } // Get value @@ -285,6 +298,8 @@ func (s *KVString) Data() maputil.SMap { // Set new value, will check value is right func (s *KVString) Set(value string) error { if value != "" { + s.Init() + key, val := strutil.SplitKV(value, s.Sep) if key != "" { s.SMap[key] = val diff --git a/cflag/ext_test.go b/cflag/ext_test.go index 348120be8..bb880b901 100644 --- a/cflag/ext_test.go +++ b/cflag/ext_test.go @@ -30,7 +30,8 @@ func TestConfString_Set(t *testing.T) { cs = cflag.ConfString{} err := cs.Set("name=inhere;age=123") assert.NoErr(t, err) - assert.NotEmpty(t, cs.Data()) + assert.NotEmpty(t, cs.Get()) + assert.NotEmpty(t, cs.String()) assert.Eq(t, "inhere", cs.Str("name")) assert.Eq(t, 123, cs.Int("age")) } @@ -41,8 +42,11 @@ func TestKVString_Set(t *testing.T) { assert.NoErr(t, kv.Set("age=234")) assert.NotEmpty(t, kv.Data()) + assert.NotEmpty(t, kv.Get()) assert.Eq(t, 234, kv.Int("age")) assert.Eq(t, "{age:234}", kv.String()) + assert.False(t, kv.IsEmpty()) + assert.True(t, kv.IsRepeatable()) assert.NoErr(t, kv.Set("name=inhere")) assert.Eq(t, "inhere", kv.Str("name"))