Skip to content

Commit 07a3e45

Browse files
committed
fix slice pointer dive tag
1 parent 05050dc commit 07a3e45

File tree

2 files changed

+73
-2
lines changed

2 files changed

+73
-2
lines changed

mold.go

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -240,7 +240,9 @@ func (t *Transformer) setByField(ctx context.Context, orig reflect.Value, ct *cT
240240
case reflect.Map:
241241
err = t.setByMap(ctx, current, ct)
242242
default:
243-
err = ErrInvalidDive
243+
if !current.IsNil() {
244+
err = ErrInvalidDive
245+
}
244246
}
245247
return
246248

@@ -257,7 +259,6 @@ func (t *Transformer) setByField(ctx context.Context, orig reflect.Value, ct *cT
257259
return
258260
}
259261
orig.Set(reflect.Indirect(newVal))
260-
current, kind = t.extractType(orig)
261262
} else {
262263
if err = ct.fn(ctx, fieldLevel{
263264
transformer: t,
@@ -268,6 +269,8 @@ func (t *Transformer) setByField(ctx context.Context, orig reflect.Value, ct *cT
268269
return
269270
}
270271
}
272+
current, kind = t.extractType(orig)
273+
271274
ct = ct.next
272275
}
273276
}

mold_test.go

Lines changed: 68 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -678,3 +678,71 @@ func TestStructArray(t *testing.T) {
678678
Equal(t, len(tt5.ArrNoTag), 1)
679679
Equal(t, tt5.ArrNoTag[0].String, "")
680680
}
681+
682+
func TestStructPtrArray(t *testing.T) {
683+
type InnerStruct struct {
684+
String string `s:"defaultStr"`
685+
}
686+
687+
type Test struct {
688+
Inner *InnerStruct
689+
ArrSetDefault *[]InnerStruct `s:"defaultArr"`
690+
ArrSetDefaultAndDive *[]InnerStruct `s:"defaultArr,dive"`
691+
ArrDive *[]InnerStruct `s:"dive"`
692+
ArrNoTag *[]InnerStruct
693+
}
694+
695+
set := New()
696+
set.SetTagName("s")
697+
set.Register("defaultArr", func(ctx context.Context, fl FieldLevel) error {
698+
if HasValue(fl.Field()) {
699+
return nil
700+
}
701+
arr := make([]InnerStruct, 2)
702+
fl.Field().Set(reflect.ValueOf(&arr))
703+
return nil
704+
})
705+
set.Register("defaultStr", func(ctx context.Context, fl FieldLevel) error {
706+
if fl.Field().String() == "ok" {
707+
return errors.New("ALREADY OK")
708+
}
709+
fl.Field().SetString("default")
710+
return nil
711+
})
712+
713+
tt1 := Test{
714+
Inner: &InnerStruct{},
715+
ArrSetDefault: &[]InnerStruct{{}},
716+
ArrSetDefaultAndDive: &[]InnerStruct{{}},
717+
ArrDive: &[]InnerStruct{{}},
718+
ArrNoTag: &[]InnerStruct{{}},
719+
}
720+
721+
err := set.Struct(context.Background(), &tt1)
722+
Equal(t, err, nil)
723+
Equal(t, len(*tt1.ArrSetDefault), 1)
724+
Equal(t, (*tt1.ArrSetDefault)[0].String, "")
725+
Equal(t, len(*tt1.ArrSetDefaultAndDive), 1)
726+
Equal(t, (*tt1.ArrSetDefaultAndDive)[0].String, "default")
727+
Equal(t, len(*tt1.ArrDive), 1)
728+
Equal(t, (*tt1.ArrDive)[0].String, "default")
729+
Equal(t, len(*tt1.ArrNoTag), 1)
730+
Equal(t, (*tt1.ArrNoTag)[0].String, "")
731+
732+
Equal(t, tt1.Inner.String, "default")
733+
734+
tt2 := Test{}
735+
736+
err = set.Struct(context.Background(), &tt2)
737+
Equal(t, err, nil)
738+
Equal(t, len(*tt2.ArrSetDefault), 2)
739+
Equal(t, (*tt2.ArrSetDefault)[0].String, "")
740+
Equal(t, (*tt2.ArrSetDefault)[1].String, "")
741+
Equal(t, len(*tt2.ArrSetDefaultAndDive), 2)
742+
Equal(t, (*tt2.ArrSetDefaultAndDive)[0].String, "default")
743+
Equal(t, (*tt2.ArrSetDefaultAndDive)[1].String, "default")
744+
Equal(t, tt2.ArrDive, nil)
745+
Equal(t, tt2.ArrNoTag, nil)
746+
747+
Equal(t, tt2.Inner, nil)
748+
}

0 commit comments

Comments
 (0)