Skip to content

Commit

Permalink
💥 update: structs - InitDefaults() for sub-struct must with tag mark
Browse files Browse the repository at this point in the history
  • Loading branch information
inhere committed Jun 6, 2023
1 parent 0c460d4 commit 3c90863
Show file tree
Hide file tree
Showing 3 changed files with 17 additions and 21 deletions.
2 changes: 1 addition & 1 deletion structs/examples_test.go
Expand Up @@ -55,7 +55,7 @@ func ExampleInitDefaults() {
type User struct {
Name string `default:"inhere"`
Age int `default:"30"`
Extra Extra
Extra Extra `default:""` // add tag for init sub struct
}

u := &User{}
Expand Down
16 changes: 6 additions & 10 deletions structs/init.go
Expand Up @@ -24,13 +24,6 @@ type InitOptions struct {
ParseEnv bool
// ValueHook before set value hook TODO
ValueHook func(val string) any
// InitStructSlice init struct slice. default: false
InitStructSlice bool
}

// InitStructSlice init struct slice
func InitStructSlice(opt *InitOptions) {
opt.InitStructSlice = true
}

// Init struct default value by field "default" tag.
Expand Down Expand Up @@ -83,6 +76,11 @@ func initDefaults(rv reflect.Value, opt *InitOptions) error {
continue
}

val, hasTag := sf.Tag.Lookup(opt.TagName)
if !hasTag || val == "-" {
continue
}

fv := rv.Field(i)
if fv.Kind() == reflect.Struct {
if err := initDefaults(fv, opt); err != nil {
Expand All @@ -105,8 +103,6 @@ func initDefaults(rv reflect.Value, opt *InitOptions) error {
continue
}

val, hasTag := sf.Tag.Lookup(opt.TagName)

// handle for pointer field
if fv.Kind() == reflect.Pointer {
if fv.IsNil() {
Expand All @@ -120,7 +116,7 @@ func initDefaults(rv reflect.Value, opt *InitOptions) error {
}
continue
}
} else if fv.Kind() == reflect.Slice && (opt.InitStructSlice || hasTag) {
} else if fv.Kind() == reflect.Slice {
el := sf.Type.Elem()
isPtr := el.Kind() == reflect.Pointer
if isPtr {
Expand Down
20 changes: 10 additions & 10 deletions structs/init_test.go
Expand Up @@ -104,9 +104,9 @@ type ExtraDefault struct {

func TestInitDefaults_nestStruct(t *testing.T) {
type User struct {
Name string `default:"inhere"`
Age int `default:"30"`
Extra ExtraDefault
Name string `default:"inhere"`
Age int `default:"30"`
Extra ExtraDefault `default:""`
}

u := &User{}
Expand All @@ -129,9 +129,9 @@ func TestInitDefaults_nestStruct(t *testing.T) {
func TestInitDefaults_ptrStructField(t *testing.T) {
// test for pointer struct field
type User struct {
Name string `default:"inhere"`
Age int `default:"30"`
Extra *ExtraDefault
Name string `default:"inhere"`
Age int `default:"30"`
Extra *ExtraDefault `default:""`
}

u := &User{}
Expand Down Expand Up @@ -172,13 +172,13 @@ func TestInitDefaults_sliceField(t *testing.T) {
func TestInitDefaults_initStructSlice(t *testing.T) {
// test for slice struct field
type User struct {
Name string `default:"inhere"`
Age int `default:"30"`
Extra []ExtraDefault
Name string `default:"inhere"`
Age int `default:"30"`
Extra []ExtraDefault `default:""`
}

u := &User{}
err := structs.Init(u, structs.InitStructSlice)
err := structs.Init(u)
dump.P(u)
assert.NoErr(t, err)
assert.NotEmpty(t, u.Extra)
Expand Down

0 comments on commit 3c90863

Please sign in to comment.