@@ -1640,125 +1640,125 @@ func TestCrossNamespaceFieldValidation(t *testing.T) {
16401640 v : vd ,
16411641 }
16421642
1643- current , kind , ok := v .getStructFieldOKInternal (val , "Inner.CreatedAt" )
1643+ current , kind , _ , ok := v .getStructFieldOKInternal (val , "Inner.CreatedAt" )
16441644 Equal (t , ok , true )
16451645 Equal (t , kind , reflect .Struct )
16461646 tm , ok := current .Interface ().(time.Time )
16471647 Equal (t , ok , true )
16481648 Equal (t , tm , now )
16491649
1650- current , kind , ok = v .getStructFieldOKInternal (val , "Inner.Slice[1]" )
1650+ current , kind , _ , ok = v .getStructFieldOKInternal (val , "Inner.Slice[1]" )
16511651 Equal (t , ok , true )
16521652 Equal (t , kind , reflect .String )
16531653 Equal (t , current .String (), "val2" )
16541654
1655- current , _ , ok = v .getStructFieldOKInternal (val , "Inner.CrazyNonExistantField" )
1655+ current , _ , _ , ok = v .getStructFieldOKInternal (val , "Inner.CrazyNonExistantField" )
16561656 Equal (t , ok , false )
16571657
1658- current , _ , ok = v .getStructFieldOKInternal (val , "Inner.Slice[101]" )
1658+ current , _ , _ , ok = v .getStructFieldOKInternal (val , "Inner.Slice[101]" )
16591659 Equal (t , ok , false )
16601660
1661- current , kind , ok = v .getStructFieldOKInternal (val , "Inner.Map[key3]" )
1661+ current , kind , _ , ok = v .getStructFieldOKInternal (val , "Inner.Map[key3]" )
16621662 Equal (t , ok , true )
16631663 Equal (t , kind , reflect .String )
16641664 Equal (t , current .String (), "val3" )
16651665
1666- current , kind , ok = v .getStructFieldOKInternal (val , "Inner.MapMap[key2][key2-1]" )
1666+ current , kind , _ , ok = v .getStructFieldOKInternal (val , "Inner.MapMap[key2][key2-1]" )
16671667 Equal (t , ok , true )
16681668 Equal (t , kind , reflect .String )
16691669 Equal (t , current .String (), "val2" )
16701670
1671- current , kind , ok = v .getStructFieldOKInternal (val , "Inner.MapStructs[key2].Name" )
1671+ current , kind , _ , ok = v .getStructFieldOKInternal (val , "Inner.MapStructs[key2].Name" )
16721672 Equal (t , ok , true )
16731673 Equal (t , kind , reflect .String )
16741674 Equal (t , current .String (), "name2" )
16751675
1676- current , kind , ok = v .getStructFieldOKInternal (val , "Inner.MapMapStruct[key3][key3-1].Name" )
1676+ current , kind , _ , ok = v .getStructFieldOKInternal (val , "Inner.MapMapStruct[key3][key3-1].Name" )
16771677 Equal (t , ok , true )
16781678 Equal (t , kind , reflect .String )
16791679 Equal (t , current .String (), "name3" )
16801680
1681- current , kind , ok = v .getStructFieldOKInternal (val , "Inner.SliceSlice[2][0]" )
1681+ current , kind , _ , ok = v .getStructFieldOKInternal (val , "Inner.SliceSlice[2][0]" )
16821682 Equal (t , ok , true )
16831683 Equal (t , kind , reflect .String )
16841684 Equal (t , current .String (), "7" )
16851685
1686- current , kind , ok = v .getStructFieldOKInternal (val , "Inner.SliceSliceStruct[2][1].Name" )
1686+ current , kind , _ , ok = v .getStructFieldOKInternal (val , "Inner.SliceSliceStruct[2][1].Name" )
16871687 Equal (t , ok , true )
16881688 Equal (t , kind , reflect .String )
16891689 Equal (t , current .String (), "name8" )
16901690
1691- current , kind , ok = v .getStructFieldOKInternal (val , "Inner.SliceMap[1][key5]" )
1691+ current , kind , _ , ok = v .getStructFieldOKInternal (val , "Inner.SliceMap[1][key5]" )
16921692 Equal (t , ok , true )
16931693 Equal (t , kind , reflect .String )
16941694 Equal (t , current .String (), "val5" )
16951695
1696- current , kind , ok = v .getStructFieldOKInternal (val , "Inner.MapSlice[key3][2]" )
1696+ current , kind , _ , ok = v .getStructFieldOKInternal (val , "Inner.MapSlice[key3][2]" )
16971697 Equal (t , ok , true )
16981698 Equal (t , kind , reflect .String )
16991699 Equal (t , current .String (), "9" )
17001700
1701- current , kind , ok = v .getStructFieldOKInternal (val , "Inner.MapInt[2]" )
1701+ current , kind , _ , ok = v .getStructFieldOKInternal (val , "Inner.MapInt[2]" )
17021702 Equal (t , ok , true )
17031703 Equal (t , kind , reflect .String )
17041704 Equal (t , current .String (), "val2" )
17051705
1706- current , kind , ok = v .getStructFieldOKInternal (val , "Inner.MapInt8[2]" )
1706+ current , kind , _ , ok = v .getStructFieldOKInternal (val , "Inner.MapInt8[2]" )
17071707 Equal (t , ok , true )
17081708 Equal (t , kind , reflect .String )
17091709 Equal (t , current .String (), "val2" )
17101710
1711- current , kind , ok = v .getStructFieldOKInternal (val , "Inner.MapInt16[2]" )
1711+ current , kind , _ , ok = v .getStructFieldOKInternal (val , "Inner.MapInt16[2]" )
17121712 Equal (t , ok , true )
17131713 Equal (t , kind , reflect .String )
17141714 Equal (t , current .String (), "val2" )
17151715
1716- current , kind , ok = v .getStructFieldOKInternal (val , "Inner.MapInt32[2]" )
1716+ current , kind , _ , ok = v .getStructFieldOKInternal (val , "Inner.MapInt32[2]" )
17171717 Equal (t , ok , true )
17181718 Equal (t , kind , reflect .String )
17191719 Equal (t , current .String (), "val2" )
17201720
1721- current , kind , ok = v .getStructFieldOKInternal (val , "Inner.MapInt64[2]" )
1721+ current , kind , _ , ok = v .getStructFieldOKInternal (val , "Inner.MapInt64[2]" )
17221722 Equal (t , ok , true )
17231723 Equal (t , kind , reflect .String )
17241724 Equal (t , current .String (), "val2" )
17251725
1726- current , kind , ok = v .getStructFieldOKInternal (val , "Inner.MapUint[2]" )
1726+ current , kind , _ , ok = v .getStructFieldOKInternal (val , "Inner.MapUint[2]" )
17271727 Equal (t , ok , true )
17281728 Equal (t , kind , reflect .String )
17291729 Equal (t , current .String (), "val2" )
17301730
1731- current , kind , ok = v .getStructFieldOKInternal (val , "Inner.MapUint8[2]" )
1731+ current , kind , _ , ok = v .getStructFieldOKInternal (val , "Inner.MapUint8[2]" )
17321732 Equal (t , ok , true )
17331733 Equal (t , kind , reflect .String )
17341734 Equal (t , current .String (), "val2" )
17351735
1736- current , kind , ok = v .getStructFieldOKInternal (val , "Inner.MapUint16[2]" )
1736+ current , kind , _ , ok = v .getStructFieldOKInternal (val , "Inner.MapUint16[2]" )
17371737 Equal (t , ok , true )
17381738 Equal (t , kind , reflect .String )
17391739 Equal (t , current .String (), "val2" )
17401740
1741- current , kind , ok = v .getStructFieldOKInternal (val , "Inner.MapUint32[2]" )
1741+ current , kind , _ , ok = v .getStructFieldOKInternal (val , "Inner.MapUint32[2]" )
17421742 Equal (t , ok , true )
17431743 Equal (t , kind , reflect .String )
17441744 Equal (t , current .String (), "val2" )
17451745
1746- current , kind , ok = v .getStructFieldOKInternal (val , "Inner.MapUint64[2]" )
1746+ current , kind , _ , ok = v .getStructFieldOKInternal (val , "Inner.MapUint64[2]" )
17471747 Equal (t , ok , true )
17481748 Equal (t , kind , reflect .String )
17491749 Equal (t , current .String (), "val2" )
17501750
1751- current , kind , ok = v .getStructFieldOKInternal (val , "Inner.MapFloat32[3.03]" )
1751+ current , kind , _ , ok = v .getStructFieldOKInternal (val , "Inner.MapFloat32[3.03]" )
17521752 Equal (t , ok , true )
17531753 Equal (t , kind , reflect .String )
17541754 Equal (t , current .String (), "val3" )
17551755
1756- current , kind , ok = v .getStructFieldOKInternal (val , "Inner.MapFloat64[2.02]" )
1756+ current , kind , _ , ok = v .getStructFieldOKInternal (val , "Inner.MapFloat64[2.02]" )
17571757 Equal (t , ok , true )
17581758 Equal (t , kind , reflect .String )
17591759 Equal (t , current .String (), "val2" )
17601760
1761- current , kind , ok = v .getStructFieldOKInternal (val , "Inner.MapBool[true]" )
1761+ current , kind , _ , ok = v .getStructFieldOKInternal (val , "Inner.MapBool[true]" )
17621762 Equal (t , ok , true )
17631763 Equal (t , kind , reflect .String )
17641764 Equal (t , current .String (), "val1" )
@@ -1784,13 +1784,13 @@ func TestCrossNamespaceFieldValidation(t *testing.T) {
17841784
17851785 val = reflect .ValueOf (test )
17861786
1787- current , kind , ok = v .getStructFieldOKInternal (val , "Inner.SliceStructs[2]" )
1787+ current , kind , _ , ok = v .getStructFieldOKInternal (val , "Inner.SliceStructs[2]" )
17881788 Equal (t , ok , true )
17891789 Equal (t , kind , reflect .Ptr )
17901790 Equal (t , current .String (), "<*validator.SliceStruct Value>" )
17911791 Equal (t , current .IsNil (), true )
17921792
1793- current , kind , ok = v .getStructFieldOKInternal (val , "Inner.SliceStructs[2].Name" )
1793+ current , kind , _ , ok = v .getStructFieldOKInternal (val , "Inner.SliceStructs[2].Name" )
17941794 Equal (t , ok , false )
17951795 Equal (t , kind , reflect .Ptr )
17961796 Equal (t , current .String (), "<*validator.SliceStruct Value>" )
@@ -8864,3 +8864,53 @@ func TestAbilityToValidateNils(t *testing.T) {
88648864 errs = val .Struct (ts )
88658865 NotEqual (t , errs , nil )
88668866}
8867+
8868+ func TestRequiredWithoutPointers (t * testing.T ) {
8869+ type Lookup struct {
8870+ FieldA * bool `json:"fieldA,omitempty" validate:"required_without=FieldB"`
8871+ FieldB * bool `json:"fieldB,omitempty" validate:"required_without=FieldA"`
8872+ }
8873+
8874+ b := true
8875+ lookup := Lookup {
8876+ FieldA : & b ,
8877+ FieldB : nil ,
8878+ }
8879+
8880+ val := New ()
8881+ errs := val .Struct (lookup )
8882+ Equal (t , errs , nil )
8883+
8884+ b = false
8885+ lookup = Lookup {
8886+ FieldA : & b ,
8887+ FieldB : nil ,
8888+ }
8889+ errs = val .Struct (lookup )
8890+ Equal (t , errs , nil )
8891+ }
8892+
8893+ func TestRequiredWithoutAllPointers (t * testing.T ) {
8894+ type Lookup struct {
8895+ FieldA * bool `json:"fieldA,omitempty" validate:"required_without_all=FieldB"`
8896+ FieldB * bool `json:"fieldB,omitempty" validate:"required_without_all=FieldA"`
8897+ }
8898+
8899+ b := true
8900+ lookup := Lookup {
8901+ FieldA : & b ,
8902+ FieldB : nil ,
8903+ }
8904+
8905+ val := New ()
8906+ errs := val .Struct (lookup )
8907+ Equal (t , errs , nil )
8908+
8909+ b = false
8910+ lookup = Lookup {
8911+ FieldA : & b ,
8912+ FieldB : nil ,
8913+ }
8914+ errs = val .Struct (lookup )
8915+ Equal (t , errs , nil )
8916+ }
0 commit comments