From ecb0bbe82169f946029bc11df77ebe6d43d7bae1 Mon Sep 17 00:00:00 2001 From: Inhere Date: Wed, 21 Jun 2023 00:33:51 +0800 Subject: [PATCH] :necktie: up: update the banding struct and init defaults logic - resolve multi slice-struct field, see issues #141 --- export.go | 22 ++++++++++------------ go.mod | 10 +++++----- go.sum | 20 ++++++++++---------- issues_test.go | 33 ++++++++++++++++++++++++++++++++- 4 files changed, 57 insertions(+), 28 deletions(-) diff --git a/export.go b/export.go index 3371d12..4917cb5 100644 --- a/export.go +++ b/export.go @@ -90,23 +90,21 @@ func (c *Config) Structure(key string, dst any) error { } } - // init default value by tag: default - if c.opts.ParseDefault { - err := structs.InitDefaults(dst, func(opt *structs.InitOptions) { - opt.ParseEnv = c.opts.ParseEnv - }) - if err != nil { - return err - } - } - bindConf := c.opts.makeDecoderConfig() // set result struct ptr bindConf.Result = dst decoder, err := mapstructure.NewDecoder(bindConf) - if err == nil { - err = decoder.Decode(data) + if err = decoder.Decode(data); err != nil { + return err + } + } + + // init default value by tag: default + if c.opts.ParseDefault { + err = structs.InitDefaults(dst, func(opt *structs.InitOptions) { + opt.ParseEnv = c.opts.ParseEnv + }) } return err } diff --git a/go.mod b/go.mod index 47c51f4..6adca41 100644 --- a/go.mod +++ b/go.mod @@ -6,7 +6,7 @@ require ( github.com/BurntSushi/toml v1.3.2 github.com/goccy/go-json v0.10.2 github.com/goccy/go-yaml v1.11.0 - github.com/gookit/goutil v0.6.9 + github.com/gookit/goutil v0.6.10 github.com/gookit/ini/v2 v2.2.2 github.com/gookit/properties v0.3.0 github.com/hashicorp/hcl v1.0.0 @@ -27,9 +27,9 @@ require ( github.com/mitchellh/go-wordwrap v1.0.1 // indirect github.com/xo/terminfo v0.0.0-20220910002029-abceb7e1c41e // indirect github.com/zclconf/go-cty v1.13.0 // indirect - golang.org/x/sync v0.2.0 // indirect - golang.org/x/sys v0.8.0 // indirect - golang.org/x/term v0.8.0 // indirect - golang.org/x/text v0.9.0 // indirect + golang.org/x/sync v0.3.0 // indirect + golang.org/x/sys v0.9.0 // indirect + golang.org/x/term v0.9.0 // indirect + golang.org/x/text v0.10.0 // indirect golang.org/x/xerrors v0.0.0-20220907171357-04be3eba64a2 // indirect ) diff --git a/go.sum b/go.sum index d741e06..c7504ed 100644 --- a/go.sum +++ b/go.sum @@ -20,8 +20,8 @@ github.com/google/go-cmp v0.5.9 h1:O2Tfq5qg4qc4AmwVlvv0oLiVAGB7enBSJ2x2DqQFi38= github.com/google/go-cmp v0.5.9/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= github.com/gookit/color v1.5.3 h1:twfIhZs4QLCtimkP7MOxlF3A0U/5cDPseRT9M/+2SCE= github.com/gookit/color v1.5.3/go.mod h1:NUzwzeehUfl7GIb36pqId+UGmRfQcU/WiiyTTeNjHtE= -github.com/gookit/goutil v0.6.9 h1:NrbGKt3cnWoqxjZonC5bTr0FrltTCRdzGReGQwnwhUk= -github.com/gookit/goutil v0.6.9/go.mod h1:ZYNl/t+EIMo0rCRe1mwfC7jKyF/q1FdOEOgrXzJpr5o= +github.com/gookit/goutil v0.6.10 h1:iq7CXOf+fYLvrVAh3+ZoLgufGfK65TwbzE8NpnPGtyk= +github.com/gookit/goutil v0.6.10/go.mod h1:qqrPoX+Pm6YmxqqccgkNLPirTFX7UYMES1SK+fokqQU= github.com/gookit/ini/v2 v2.2.2 h1:3B8abZJrVH1vi/7TU4STuTBxdhiAq1ORSt6NJZCahaI= github.com/gookit/ini/v2 v2.2.2/go.mod h1:wGEfnBxv+7nVXytWM44tiqczv5hLKJ+m9MaA2uJg3iM= github.com/gookit/properties v0.3.0 h1:52NBYMOP5VXm3mKrQSdQoeEPgk2zXBGDF1R/xblsa6Y= @@ -57,15 +57,15 @@ github.com/zclconf/go-cty v1.13.0 h1:It5dfKTTZHe9aeppbNOda3mN7Ag7sg6QkBNm6TkyFa0 github.com/zclconf/go-cty v1.13.0/go.mod h1:YKQzy/7pZ7iq2jNFzy5go57xdxdWoLLpaEp4u238AE0= golang.org/x/crypto v0.7.0 h1:AvwMYaRytfdeVt3u6mLaxYtErKYjxA2OXjJ1HHq6t3A= golang.org/x/exp v0.0.0-20220909182711-5c715a9e8561 h1:MDc5xs78ZrZr3HMQugiXOAkSZtfTpbJLDr/lwfgO53E= -golang.org/x/sync v0.2.0 h1:PUR+T4wwASmuSTYdKjYHI5TD22Wy5ogLU5qZCOLxBrI= -golang.org/x/sync v0.2.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.3.0 h1:ftCYgMx6zT/asHUrPw8BLLscYtGznsLAnjq5RH9P66E= +golang.org/x/sync v0.3.0/go.mod h1:FU7BRWz2tNW+3quACPkgCx/L+uEAv1htQ0V83Z9Rj+Y= golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.8.0 h1:EBmGv8NaZBZTWvrbjNoL6HVt+IVy3QDQpJs7VRIw3tU= -golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/term v0.8.0 h1:n5xxQn2i3PC0yLAbjTpNT85q/Kgzcr2gIoX9OrJUols= -golang.org/x/term v0.8.0/go.mod h1:xPskH00ivmX89bAKVGSKKtLOWNx2+17Eiy94tnKShWo= -golang.org/x/text v0.9.0 h1:2sjJmO8cDvYveuX97RDLsxlyUxLl+GHoLxBiRdHllBE= -golang.org/x/text v0.9.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8= +golang.org/x/sys v0.9.0 h1:KS/R3tvhPqvJvwcKfnBHJwwthS11LRhmM5D59eEXa0s= +golang.org/x/sys v0.9.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/term v0.9.0 h1:GRRCnKYhdQrD8kfRAdQ6Zcw1P0OcELxGLKJvtjVMZ28= +golang.org/x/term v0.9.0/go.mod h1:M6DEAAIenWoTxdKrOltXcmDY3rSplQUkrvaDU5FcQyo= +golang.org/x/text v0.10.0 h1:UpjohKhiEgNc0CSauXmwYftY1+LlaC75SJwh0SgCX58= +golang.org/x/text v0.10.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= golang.org/x/xerrors v0.0.0-20220907171357-04be3eba64a2 h1:H2TDz8ibqkAF6YGhCdN3jS9O0/s90v0rJh3X/OLHEUk= golang.org/x/xerrors v0.0.0-20220907171357-04be3eba64a2/go.mod h1:K8+ghG5WaK9qNqU5K3HdILfMLy1f3aNYFI/wnl100a8= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= diff --git a/issues_test.go b/issues_test.go index cc1e3eb..68a9fe7 100644 --- a/issues_test.go +++ b/issues_test.go @@ -369,7 +369,38 @@ func TestIssues_141(t *testing.T) { assert.Eq(t, 2048, opt.Loggers[1].MaxSize) assert.Eq(t, 30, opt.Loggers[1].MaxDays) - assert.Eq(t, false, opt.Loggers[1].Compress) + assert.Eq(t, true, opt.Loggers[1].Compress) + + t.Run("3 elements", func(t *testing.T) { + jsonStr := ` +{ + "loggers": [ + { + "name": "info", + "logFile": "logs/info.log" + }, + { + "name": "error", + "logFile": "logs/error.log" + }, + { + "name": "request", + "logFile": "logs/request.log", + "maxSize": 2048, + "maxDays": 30, + "compress": false + } + ] +} +` + c := config.New("issues_141", config.ParseDefault) + err := c.LoadStrings(config.JSON, jsonStr) + assert.NoErr(t, err) + + opt := &LogConfig{} + err = c.Decode(opt) + dump.Println(opt) + }) } // https://github.com/gookit/config/issues/146