Compare commits
2 Commits
Author | SHA1 | Date | |
---|---|---|---|
ee09f57192 | |||
d6a35346cc |
7
flag.go
7
flag.go
@@ -100,12 +100,15 @@ func (c *flagConfig) Init(opts ...config.Option) error {
|
|||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func (c *flagConfig) Load(ctx context.Context) error {
|
func (c *flagConfig) Load(ctx context.Context, opts ...config.LoadOption) error {
|
||||||
|
options := config.NewLoadOptions(opts...)
|
||||||
|
_ = options
|
||||||
|
// TODO: allow merge, append and so
|
||||||
flag.Parse()
|
flag.Parse()
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func (c *flagConfig) Save(ctx context.Context) error {
|
func (c *flagConfig) Save(ctx context.Context, opts ...config.SaveOption) error {
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
12
flag_test.go
12
flag_test.go
@@ -15,12 +15,14 @@ func TestLoad(t *testing.T) {
|
|||||||
os.Args = append(os.Args, "-wait", "5s")
|
os.Args = append(os.Args, "-wait", "5s")
|
||||||
os.Args = append(os.Args, "-addr", "33,44")
|
os.Args = append(os.Args, "-addr", "33,44")
|
||||||
os.Args = append(os.Args, "-time", time.RFC822)
|
os.Args = append(os.Args, "-time", time.RFC822)
|
||||||
|
os.Args = append(os.Args, "-metadata", "key=20")
|
||||||
type Config struct {
|
type Config struct {
|
||||||
Broker string `flag:"name=broker,desc='description with, comma',default='127.0.0.1:9092'"`
|
Broker string `flag:"name=broker,desc='description with, comma',default='127.0.0.1:9092'"`
|
||||||
Verbose bool `flag:"name=verbose,desc='verbose output',default='false'"`
|
Verbose bool `flag:"name=verbose,desc='verbose output',default='false'"`
|
||||||
Addr []string `flag:"name=addr,desc='addrs',default='127.0.0.1:9092'"`
|
Addr []string `flag:"name=addr,desc='addrs',default='127.0.0.1:9092'"`
|
||||||
Wait time.Duration `flag:"name=wait,desc='wait time',default='2s'"`
|
Wait time.Duration `flag:"name=wait,desc='wait time',default='2s'"`
|
||||||
Time time.Time `flag:"name=time,desc='some time',default='02 Jan 06 15:04 MST'"`
|
Time time.Time `flag:"name=time,desc='some time',default='02 Jan 06 15:04 MST'"`
|
||||||
|
Metadata map[string]int `flag:"name=metadata,desc='some meta',default=''"`
|
||||||
}
|
}
|
||||||
|
|
||||||
ctx := context.Background()
|
ctx := context.Background()
|
||||||
|
2
go.mod
2
go.mod
@@ -2,4 +2,4 @@ module github.com/unistack-org/micro-config-flag/v3
|
|||||||
|
|
||||||
go 1.16
|
go 1.16
|
||||||
|
|
||||||
require github.com/unistack-org/micro/v3 v3.3.23
|
require github.com/unistack-org/micro/v3 v3.4.0
|
||||||
|
4
go.sum
4
go.sum
@@ -5,8 +5,8 @@ github.com/imdario/mergo v0.3.12 h1:b6R2BslTbIEToALKP7LxUvijTsNI9TAe80pLWN2g/HU=
|
|||||||
github.com/imdario/mergo v0.3.12/go.mod h1:jmQim1M+e3UYxmgPu/WyfjB3N3VflVyUjjjwH0dnCYA=
|
github.com/imdario/mergo v0.3.12/go.mod h1:jmQim1M+e3UYxmgPu/WyfjB3N3VflVyUjjjwH0dnCYA=
|
||||||
github.com/patrickmn/go-cache v2.1.0+incompatible/go.mod h1:3Qf8kWWT7OJRJbdiICTKqZju1ZixQ/KpMGzzAfe6+WQ=
|
github.com/patrickmn/go-cache v2.1.0+incompatible/go.mod h1:3Qf8kWWT7OJRJbdiICTKqZju1ZixQ/KpMGzzAfe6+WQ=
|
||||||
github.com/silas/dag v0.0.0-20210121180416-41cf55125c34/go.mod h1:7RTUFBdIRC9nZ7/3RyRNH1bdqIShrDejd1YbLwgPS+I=
|
github.com/silas/dag v0.0.0-20210121180416-41cf55125c34/go.mod h1:7RTUFBdIRC9nZ7/3RyRNH1bdqIShrDejd1YbLwgPS+I=
|
||||||
github.com/unistack-org/micro/v3 v3.3.23 h1:iQtvVF4p+HPtWgm/zPt7+gN78EQMf1rHSMppxYlbRHQ=
|
github.com/unistack-org/micro/v3 v3.4.0 h1:z9F3lgAb2j4cZ1ib5qBj66JPYUAzR4sNIJqUDjVwyVQ=
|
||||||
github.com/unistack-org/micro/v3 v3.3.23/go.mod h1:LXmPfbJnJNvL0kQs8HfnkV3Wya2Wb+C7keVq++RCZnk=
|
github.com/unistack-org/micro/v3 v3.4.0/go.mod h1:LXmPfbJnJNvL0kQs8HfnkV3Wya2Wb+C7keVq++RCZnk=
|
||||||
golang.org/x/net v0.0.0-20210510120150-4163338589ed/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=
|
golang.org/x/net v0.0.0-20210510120150-4163338589ed/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=
|
||||||
golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||||
golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||||
|
78
util.go
78
util.go
@@ -8,6 +8,41 @@ import (
|
|||||||
"time"
|
"time"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
func convertType(v reflect.Value, t reflect.Kind) (reflect.Value, error) {
|
||||||
|
switch v.Kind() {
|
||||||
|
case reflect.String:
|
||||||
|
switch t {
|
||||||
|
case reflect.String:
|
||||||
|
return v, nil
|
||||||
|
case reflect.Int, reflect.Int64:
|
||||||
|
i, err := strconv.ParseInt(v.String(), 10, 64)
|
||||||
|
if err != nil {
|
||||||
|
return v, err
|
||||||
|
}
|
||||||
|
return reflect.ValueOf(i), nil
|
||||||
|
case reflect.Uint, reflect.Uint64:
|
||||||
|
i, err := strconv.ParseUint(v.String(), 10, 64)
|
||||||
|
if err != nil {
|
||||||
|
return v, err
|
||||||
|
}
|
||||||
|
return reflect.ValueOf(i), nil
|
||||||
|
case reflect.Float64:
|
||||||
|
i, err := strconv.ParseFloat(v.String(), 64)
|
||||||
|
if err != nil {
|
||||||
|
return v, err
|
||||||
|
}
|
||||||
|
return reflect.ValueOf(i), nil
|
||||||
|
case reflect.Bool:
|
||||||
|
i, err := strconv.ParseBool(v.String())
|
||||||
|
if err != nil {
|
||||||
|
return v, err
|
||||||
|
}
|
||||||
|
return reflect.ValueOf(i), nil
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return v, ErrInvalidValue
|
||||||
|
}
|
||||||
|
|
||||||
func (c *flagConfig) flagSlice(v reflect.Value, fn, fv, fd string) error {
|
func (c *flagConfig) flagSlice(v reflect.Value, fn, fv, fd string) error {
|
||||||
delim := DefaultSliceDelim
|
delim := DefaultSliceDelim
|
||||||
if c.opts.Context != nil {
|
if c.opts.Context != nil {
|
||||||
@@ -64,6 +99,49 @@ func (c *flagConfig) flagSlice(v reflect.Value, fn, fv, fd string) error {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func (c *flagConfig) flagMap(v reflect.Value, fn, fv, fd string) error {
|
func (c *flagConfig) flagMap(v reflect.Value, fn, fv, fd string) error {
|
||||||
|
delim := DefaultMapDelim
|
||||||
|
if c.opts.Context != nil {
|
||||||
|
if d, ok := c.opts.Context.Value(mapDelimKey{}).(string); ok {
|
||||||
|
delim = d
|
||||||
|
}
|
||||||
|
}
|
||||||
|
flag.Func(fn, fd, func(s string) error {
|
||||||
|
ps := strings.Split(s, delim)
|
||||||
|
if len(ps) == 0 {
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
v.Set(reflect.MakeMapWithSize(v.Type(), len(ps)))
|
||||||
|
kt := v.Type().Key().Kind()
|
||||||
|
vt := v.Type().Elem().Kind()
|
||||||
|
|
||||||
|
for i := 0; i < len(ps); i++ {
|
||||||
|
fs := strings.Split(ps[i], "=")
|
||||||
|
switch len(fs) {
|
||||||
|
case 0:
|
||||||
|
return nil
|
||||||
|
case 1:
|
||||||
|
if len(fs[0]) == 0 {
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
return ErrInvalidValue
|
||||||
|
case 2:
|
||||||
|
break
|
||||||
|
default:
|
||||||
|
return ErrInvalidValue
|
||||||
|
}
|
||||||
|
key, err := convertType(reflect.ValueOf(fs[0]), kt)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
val, err := convertType(reflect.ValueOf(fs[1]), vt)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
v.SetMapIndex(key.Convert(v.Type().Key()), val.Convert(v.Type().Elem()))
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
})
|
||||||
|
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user