Skip to content

Commit 49fccad

Browse files
Dean KarnDean Karn
authored andcommitted
correct structonly functionality
- structonly wasn’t behaving correctly when not used with an accompanying struct validation.
1 parent 941ce2c commit 49fccad

File tree

3 files changed

+103
-54
lines changed

3 files changed

+103
-54
lines changed

README.md

Lines changed: 54 additions & 54 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ Package validator
22
================
33
<img align="right" src="https://raw.githubusercontent.com/go-playground/validator/v9/logo.png">
44
[![Join the chat at https://gitter.im/go-playground/validator](https://badges.gitter.im/Join%20Chat.svg)](https://gitter.im/go-playground/validator?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge)
5-
![Project status](https://img.shields.io/badge/version-9.3.0-green.svg)
5+
![Project status](https://img.shields.io/badge/version-9.3.1-green.svg)
66
[![Build Status](https://semaphoreci.com/api/v1/joeybloggs/validator/branches/v9/badge.svg)](https://semaphoreci.com/joeybloggs/validator)
77
[![Coverage Status](https://coveralls.io/repos/go-playground/validator/badge.svg?branch=v9&service=github)](https://coveralls.io/github/go-playground/validator?branch=v9)
88
[![Go Report Card](https://goreportcard.com/badge/github.com/go-playground/validator)](https://goreportcard.com/report/github.com/go-playground/validator)
@@ -66,60 +66,60 @@ Please see http://godoc.org/gopkg.in/go-playground/validator.v9 for detailed usa
6666

6767
Benchmarks
6868
------
69-
###### Run on MacBook Pro (Retina, 15-inch, Late 2013) 2.6 GHz Intel Core i7 16 GB 1600 MHz DDR3 using Go version go1.7.1 darwin/amd64
69+
###### Run on MacBook Pro (Retina, 15-inch, Late 2013) 2.6 GHz Intel Core i7 16 GB 1600 MHz DDR3 using Go version go1.7.4 darwin/amd64
7070
```go
71-
BenchmarkFieldSuccess-8 20000000 106 ns/op
72-
BenchmarkFieldSuccessParallel-8 50000000 33.7 ns/op
73-
BenchmarkFieldFailure-8 5000000 346 ns/op
74-
BenchmarkFieldFailureParallel-8 20000000 115 ns/op
75-
BenchmarkFieldDiveSuccess-8 2000000 739 ns/op
76-
BenchmarkFieldDiveSuccessParallel-8 10000000 246 ns/op
77-
BenchmarkFieldDiveFailure-8 1000000 1043 ns/op
78-
BenchmarkFieldDiveFailureParallel-8 5000000 381 ns/op
79-
BenchmarkFieldCustomTypeSuccess-8 5000000 270 ns/op
80-
BenchmarkFieldCustomTypeSuccessParallel-8 20000000 92.5 ns/op
81-
BenchmarkFieldCustomTypeFailure-8 5000000 331 ns/op
82-
BenchmarkFieldCustomTypeFailureParallel-8 20000000 132 ns/op
83-
BenchmarkFieldOrTagSuccess-8 2000000 874 ns/op
84-
BenchmarkFieldOrTagSuccessParallel-8 5000000 368 ns/op
85-
BenchmarkFieldOrTagFailure-8 3000000 566 ns/op
86-
BenchmarkFieldOrTagFailureParallel-8 5000000 427 ns/op
87-
BenchmarkStructLevelValidationSuccess-8 5000000 335 ns/op
88-
BenchmarkStructLevelValidationSuccessParallel-8 20000000 124 ns/op
89-
BenchmarkStructLevelValidationFailure-8 2000000 630 ns/op
90-
BenchmarkStructLevelValidationFailureParallel-8 10000000 298 ns/op
91-
BenchmarkStructSimpleCustomTypeSuccess-8 3000000 535 ns/op
92-
BenchmarkStructSimpleCustomTypeSuccessParallel-8 10000000 170 ns/op
93-
BenchmarkStructSimpleCustomTypeFailure-8 2000000 821 ns/op
94-
BenchmarkStructSimpleCustomTypeFailureParallel-8 5000000 379 ns/op
95-
BenchmarkStructFilteredSuccess-8 2000000 769 ns/op
96-
BenchmarkStructFilteredSuccessParallel-8 5000000 328 ns/op
97-
BenchmarkStructFilteredFailure-8 2000000 594 ns/op
98-
BenchmarkStructFilteredFailureParallel-8 10000000 244 ns/op
99-
BenchmarkStructPartialSuccess-8 2000000 682 ns/op
100-
BenchmarkStructPartialSuccessParallel-8 5000000 291 ns/op
101-
BenchmarkStructPartialFailure-8 1000000 1034 ns/op
102-
BenchmarkStructPartialFailureParallel-8 5000000 392 ns/op
103-
BenchmarkStructExceptSuccess-8 1000000 1014 ns/op
104-
BenchmarkStructExceptSuccessParallel-8 10000000 257 ns/op
105-
BenchmarkStructExceptFailure-8 2000000 875 ns/op
106-
BenchmarkStructExceptFailureParallel-8 5000000 405 ns/op
107-
BenchmarkStructSimpleCrossFieldSuccess-8 3000000 545 ns/op
108-
BenchmarkStructSimpleCrossFieldSuccessParallel-8 10000000 177 ns/op
109-
BenchmarkStructSimpleCrossFieldFailure-8 2000000 787 ns/op
110-
BenchmarkStructSimpleCrossFieldFailureParallel-8 5000000 341 ns/op
111-
BenchmarkStructSimpleCrossStructCrossFieldSuccess-8 2000000 795 ns/op
112-
BenchmarkStructSimpleCrossStructCrossFieldSuccessParallel-8 10000000 267 ns/op
113-
BenchmarkStructSimpleCrossStructCrossFieldFailure-8 1000000 1119 ns/op
114-
BenchmarkStructSimpleCrossStructCrossFieldFailureParallel-8 3000000 437 ns/op
115-
BenchmarkStructSimpleSuccess-8 5000000 377 ns/op
116-
BenchmarkStructSimpleSuccessParallel-8 20000000 110 ns/op
117-
BenchmarkStructSimpleFailure-8 2000000 785 ns/op
118-
BenchmarkStructSimpleFailureParallel-8 5000000 302 ns/op
119-
BenchmarkStructComplexSuccess-8 1000000 2159 ns/op
120-
BenchmarkStructComplexSuccessParallel-8 2000000 723 ns/op
121-
BenchmarkStructComplexFailure-8 300000 5237 ns/op
122-
BenchmarkStructComplexFailureParallel-8 1000000 2378 ns/op
71+
BenchmarkFieldSuccess-8 20000000 107 ns/op 0 B/op 0 allocs/op
72+
BenchmarkFieldSuccessParallel-8 50000000 33.6 ns/op 0 B/op 0 allocs/op
73+
BenchmarkFieldFailure-8 5000000 333 ns/op 208 B/op 4 allocs/op
74+
BenchmarkFieldFailureParallel-8 20000000 117 ns/op 208 B/op 4 allocs/op
75+
BenchmarkFieldDiveSuccess-8 2000000 766 ns/op 201 B/op 11 allocs/op
76+
BenchmarkFieldDiveSuccessParallel-8 10000000 232 ns/op 201 B/op 11 allocs/op
77+
BenchmarkFieldDiveFailure-8 2000000 1000 ns/op 412 B/op 16 allocs/op
78+
BenchmarkFieldDiveFailureParallel-8 5000000 337 ns/op 413 B/op 16 allocs/op
79+
BenchmarkFieldCustomTypeSuccess-8 5000000 264 ns/op 32 B/op 2 allocs/op
80+
BenchmarkFieldCustomTypeSuccessParallel-8 20000000 83.5 ns/op 32 B/op 2 allocs/op
81+
BenchmarkFieldCustomTypeFailure-8 5000000 343 ns/op 208 B/op 4 allocs/op
82+
BenchmarkFieldCustomTypeFailureParallel-8 20000000 122 ns/op 208 B/op 4 allocs/op
83+
BenchmarkFieldOrTagSuccess-8 2000000 872 ns/op 16 B/op 1 allocs/op
84+
BenchmarkFieldOrTagSuccessParallel-8 3000000 410 ns/op 16 B/op 1 allocs/op
85+
BenchmarkFieldOrTagFailure-8 3000000 569 ns/op 224 B/op 5 allocs/op
86+
BenchmarkFieldOrTagFailureParallel-8 3000000 407 ns/op 224 B/op 5 allocs/op
87+
BenchmarkStructLevelValidationSuccess-8 5000000 268 ns/op 32 B/op 2 allocs/op
88+
BenchmarkStructLevelValidationSuccessParallel-8 20000000 83.3 ns/op 32 B/op 2 allocs/op
89+
BenchmarkStructLevelValidationFailure-8 3000000 567 ns/op 304 B/op 8 allocs/op
90+
BenchmarkStructLevelValidationFailureParallel-8 10000000 204 ns/op 304 B/op 8 allocs/op
91+
BenchmarkStructSimpleCustomTypeSuccess-8 3000000 457 ns/op 32 B/op 2 allocs/op
92+
BenchmarkStructSimpleCustomTypeSuccessParallel-8 10000000 136 ns/op 32 B/op 2 allocs/op
93+
BenchmarkStructSimpleCustomTypeFailure-8 2000000 757 ns/op 424 B/op 9 allocs/op
94+
BenchmarkStructSimpleCustomTypeFailureParallel-8 5000000 310 ns/op 440 B/op 10 allocs/op
95+
BenchmarkStructFilteredSuccess-8 2000000 678 ns/op 288 B/op 9 allocs/op
96+
BenchmarkStructFilteredSuccessParallel-8 10000000 258 ns/op 288 B/op 9 allocs/op
97+
BenchmarkStructFilteredFailure-8 3000000 521 ns/op 256 B/op 7 allocs/op
98+
BenchmarkStructFilteredFailureParallel-8 10000000 197 ns/op 256 B/op 7 allocs/op
99+
BenchmarkStructPartialSuccess-8 2000000 602 ns/op 256 B/op 6 allocs/op
100+
BenchmarkStructPartialSuccessParallel-8 10000000 241 ns/op 256 B/op 6 allocs/op
101+
BenchmarkStructPartialFailure-8 2000000 866 ns/op 480 B/op 11 allocs/op
102+
BenchmarkStructPartialFailureParallel-8 5000000 347 ns/op 480 B/op 11 allocs/op
103+
BenchmarkStructExceptSuccess-8 2000000 955 ns/op 496 B/op 12 allocs/op
104+
BenchmarkStructExceptSuccessParallel-8 10000000 209 ns/op 240 B/op 5 allocs/op
105+
BenchmarkStructExceptFailure-8 2000000 809 ns/op 464 B/op 10 allocs/op
106+
BenchmarkStructExceptFailureParallel-8 5000000 335 ns/op 464 B/op 10 allocs/op
107+
BenchmarkStructSimpleCrossFieldSuccess-8 3000000 469 ns/op 72 B/op 3 allocs/op
108+
BenchmarkStructSimpleCrossFieldSuccessParallel-8 10000000 167 ns/op 72 B/op 3 allocs/op
109+
BenchmarkStructSimpleCrossFieldFailure-8 2000000 714 ns/op 304 B/op 8 allocs/op
110+
BenchmarkStructSimpleCrossFieldFailureParallel-8 5000000 278 ns/op 304 B/op 8 allocs/op
111+
BenchmarkStructSimpleCrossStructCrossFieldSuccess-8 2000000 660 ns/op 80 B/op 4 allocs/op
112+
BenchmarkStructSimpleCrossStructCrossFieldSuccessParallel-8 10000000 244 ns/op 80 B/op 4 allocs/op
113+
BenchmarkStructSimpleCrossStructCrossFieldFailure-8 2000000 939 ns/op 320 B/op 9 allocs/op
114+
BenchmarkStructSimpleCrossStructCrossFieldFailureParallel-8 5000000 382 ns/op 320 B/op 9 allocs/op
115+
BenchmarkStructSimpleSuccess-8 5000000 287 ns/op 0 B/op 0 allocs/op
116+
BenchmarkStructSimpleSuccessParallel-8 20000000 90.5 ns/op 0 B/op 0 allocs/op
117+
BenchmarkStructSimpleFailure-8 2000000 712 ns/op 424 B/op 9 allocs/op
118+
BenchmarkStructSimpleFailureParallel-8 5000000 298 ns/op 424 B/op 9 allocs/op
119+
BenchmarkStructComplexSuccess-8 1000000 1645 ns/op 128 B/op 8 allocs/op
120+
BenchmarkStructComplexSuccessParallel-8 3000000 544 ns/op 128 B/op 8 allocs/op
121+
BenchmarkStructComplexFailure-8 300000 4688 ns/op 3041 B/op 53 allocs/op
122+
BenchmarkStructComplexFailureParallel-8 1000000 2064 ns/op 3041 B/op 53 allocs/op
123123
```
124124

125125
Complimentary Software

validator.go

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -169,13 +169,19 @@ func (v *validate) traverseField(parent reflect.Value, current reflect.Value, ns
169169
if typ != timeType {
170170

171171
if ct != nil {
172+
173+
if ct.typeof == typeStructOnly {
174+
goto CONTINUE
175+
}
176+
172177
ct = ct.next
173178
}
174179

175180
if ct != nil && ct.typeof == typeNoStructLevel {
176181
return
177182
}
178183

184+
CONTINUE:
179185
// if len == 0 then validating using 'Var' or 'VarWithValue'
180186
// Var - doesn't make much sense to do it that way, should call 'Struct', but no harm...
181187
// VarWithField - this allows for validating against each field withing the struct against a specific value

validator_test.go

Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4391,6 +4391,49 @@ func TestStructOnlyValidation(t *testing.T) {
43914391

43924392
errs = validate.Struct(outer)
43934393
Equal(t, errs, nil)
4394+
4395+
// Address houses a users address information
4396+
type Address struct {
4397+
Street string `validate:"required"`
4398+
City string `validate:"required"`
4399+
Planet string `validate:"required"`
4400+
Phone string `validate:"required"`
4401+
}
4402+
4403+
type User struct {
4404+
FirstName string `json:"fname"`
4405+
LastName string `json:"lname"`
4406+
Age uint8 `validate:"gte=0,lte=130"`
4407+
Email string `validate:"required,email"`
4408+
FavouriteColor string `validate:"hexcolor|rgb|rgba"`
4409+
Addresses []*Address `validate:"required"` // a person can have a home and cottage...
4410+
Address Address `validate:"structonly"` // a person can have a home and cottage...
4411+
}
4412+
4413+
address := &Address{
4414+
Street: "Eavesdown Docks",
4415+
Planet: "Persphone",
4416+
Phone: "none",
4417+
City: "Unknown",
4418+
}
4419+
4420+
user := &User{
4421+
FirstName: "",
4422+
LastName: "",
4423+
Age: 45,
4424+
4425+
FavouriteColor: "#000",
4426+
Addresses: []*Address{address},
4427+
Address: Address{
4428+
// Street: "Eavesdown Docks",
4429+
Planet: "Persphone",
4430+
Phone: "none",
4431+
City: "Unknown",
4432+
},
4433+
}
4434+
4435+
errs = validate.Struct(user)
4436+
Equal(t, errs, nil)
43944437
}
43954438

43964439
func TestGtField(t *testing.T) {

0 commit comments

Comments
 (0)