@@ -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