mirror of
https://github.com/weaveworks/scope.git
synced 2026-07-18 21:09:38 +00:00
``` $ gvt delete github.com/weaveworks/common $ gvt fetch --revision 4d96fd8dcf2c7b417912c6219b310112cb4a4626 github.com/weaveworks/common 2018/07/23 15:31:11 Fetching: github.com/weaveworks/common 2018/07/23 15:31:14 · Skipping (existing): github.com/golang/protobuf/ptypes/any 2018/07/23 15:31:14 · Fetching recursive dependency: github.com/pkg/errors 2018/07/23 15:31:16 · Skipping (existing): github.com/aws/aws-sdk-go/aws 2018/07/23 15:31:16 · Fetching recursive dependency: github.com/sirupsen/logrus 2018/07/23 15:31:18 ·· Skipping (existing): golang.org/x/sys/unix 2018/07/23 15:31:18 ·· Skipping (existing): golang.org/x/crypto/ssh/terminal 2018/07/23 15:31:18 · Skipping (existing): google.golang.org/grpc/status 2018/07/23 15:31:18 · Skipping (existing): github.com/gorilla/mux 2018/07/23 15:31:18 · Fetching recursive dependency: github.com/opentracing-contrib/go-stdlib/nethttp 2018/07/23 15:31:20 ·· Skipping (existing): github.com/opentracing/opentracing-go/ext 2018/07/23 15:31:20 ·· Skipping (existing): github.com/opentracing/opentracing-go/log 2018/07/23 15:31:20 ·· Skipping (existing): github.com/opentracing/opentracing-go 2018/07/23 15:31:20 · Skipping (existing): github.com/prometheus/client_golang/prometheus 2018/07/23 15:31:20 · Skipping (existing): google.golang.org/grpc 2018/07/23 15:31:20 · Skipping (existing): github.com/pmezard/go-difflib/difflib 2018/07/23 15:31:20 · Fetching recursive dependency: github.com/go-kit/kit/log 2018/07/23 15:31:23 ·· Fetching recursive dependency: github.com/go-logfmt/logfmt 2018/07/23 15:31:25 ··· Fetching recursive dependency: github.com/kr/logfmt 2018/07/23 15:31:27 ·· Fetching recursive dependency: github.com/go-stack/stack 2018/07/23 15:31:29 · Fetching recursive dependency: google.golang.org/genproto/googleapis/rpc/status 2018/07/23 15:31:37 ·· Skipping (existing): github.com/golang/protobuf/proto 2018/07/23 15:31:37 ·· Skipping (existing): github.com/golang/protobuf/ptypes/any 2018/07/23 15:31:37 · Skipping (existing): github.com/opentracing/opentracing-go/log 2018/07/23 15:31:37 · Fetching recursive dependency: github.com/sercand/kuberesolver 2018/07/23 15:31:39 ·· Skipping (existing): google.golang.org/grpc/grpclog 2018/07/23 15:31:39 ·· Skipping (existing): google.golang.org/grpc/resolver 2018/07/23 15:31:39 ·· Skipping (existing): golang.org/x/net/context 2018/07/23 15:31:39 · Skipping (existing): google.golang.org/grpc/metadata 2018/07/23 15:31:39 · Skipping (existing): github.com/opentracing/opentracing-go/ext 2018/07/23 15:31:39 · Skipping (existing): github.com/armon/go-socks5 2018/07/23 15:31:39 · Skipping (existing): github.com/opentracing/opentracing-go 2018/07/23 15:31:39 · Skipping (existing): github.com/davecgh/go-spew/spew 2018/07/23 15:31:39 · Skipping (existing): github.com/golang/protobuf/ptypes 2018/07/23 15:31:39 · Skipping (existing): github.com/golang/protobuf/proto 2018/07/23 15:31:39 · Fetching recursive dependency: github.com/grpc-ecosystem/grpc-opentracing/go/otgrpc 2018/07/23 15:31:41 ·· Skipping (existing): github.com/opentracing/opentracing-go/log 2018/07/23 15:31:41 ·· Skipping (existing): golang.org/x/net/context 2018/07/23 15:31:41 ·· Skipping (existing): google.golang.org/grpc/codes 2018/07/23 15:31:41 ·· Skipping (existing): github.com/golang/protobuf/proto 2018/07/23 15:31:41 ·· Skipping (existing): github.com/opentracing/opentracing-go 2018/07/23 15:31:41 ·· Skipping (existing): github.com/opentracing/opentracing-go/ext 2018/07/23 15:31:41 ·· Skipping (existing): google.golang.org/grpc 2018/07/23 15:31:41 ·· Skipping (existing): google.golang.org/grpc/metadata 2018/07/23 15:31:41 ·· Skipping (existing): google.golang.org/grpc/status 2018/07/23 15:31:41 · Fetching recursive dependency: github.com/uber/jaeger-client-go/config 2018/07/23 15:31:44 ·· Fetching recursive dependency: github.com/uber/jaeger-client-go/internal/throttler/remote 2018/07/23 15:31:44 ··· Fetching recursive dependency: github.com/uber/jaeger-client-go/utils 2018/07/23 15:31:44 ···· Fetching recursive dependency: github.com/uber/jaeger-client-go/thrift 2018/07/23 15:31:44 ···· Fetching recursive dependency: github.com/uber/jaeger-client-go/thrift-gen/agent 2018/07/23 15:31:44 ····· Fetching recursive dependency: github.com/uber/jaeger-client-go/thrift-gen/jaeger 2018/07/23 15:31:44 ····· Fetching recursive dependency: github.com/uber/jaeger-client-go/thrift-gen/zipkincore 2018/07/23 15:31:44 ··· Fetching recursive dependency: github.com/uber/jaeger-client-go 2018/07/23 15:31:44 ···· Fetching recursive dependency: github.com/crossdock/crossdock-go 2018/07/23 15:31:46 ····· Skipping (existing): github.com/davecgh/go-spew/spew 2018/07/23 15:31:46 ····· Skipping (existing): golang.org/x/net/context/ctxhttp 2018/07/23 15:31:46 ····· Skipping (existing): golang.org/x/net/context 2018/07/23 15:31:46 ····· Skipping (existing): github.com/pmezard/go-difflib/difflib 2018/07/23 15:31:46 ···· Skipping (existing): github.com/opentracing/opentracing-go/log 2018/07/23 15:31:46 ···· Fetching recursive dependency: go.uber.org/zap/zapcore 2018/07/23 15:31:49 ····· Fetching recursive dependency: go.uber.org/atomic 2018/07/23 15:31:51 ····· Fetching recursive dependency: go.uber.org/zap/internal/bufferpool 2018/07/23 15:31:51 ······ Fetching recursive dependency: go.uber.org/zap/buffer 2018/07/23 15:31:51 ····· Fetching recursive dependency: go.uber.org/multierr 2018/07/23 15:31:54 ····· Fetching recursive dependency: go.uber.org/zap/internal/exit 2018/07/23 15:31:54 ····· Fetching recursive dependency: go.uber.org/zap/internal/color 2018/07/23 15:31:54 ···· Fetching recursive dependency: go.uber.org/zap 2018/07/23 15:31:54 ···· Skipping (existing): github.com/opentracing/opentracing-go 2018/07/23 15:31:54 ···· Skipping (existing): github.com/opentracing/opentracing-go/ext 2018/07/23 15:31:54 ···· Fetching recursive dependency: github.com/uber/jaeger-lib/metrics 2018/07/23 15:31:56 ····· Fetching recursive dependency: github.com/uber-go/tally 2018/07/23 15:31:58 ······ Fetching recursive dependency: github.com/m3db/prometheus_client_golang/prometheus/promhttp 2018/07/23 15:32:00 ······· Skipping (existing): github.com/prometheus/client_golang/prometheus 2018/07/23 15:32:00 ······· Skipping (existing): github.com/prometheus/common/expfmt 2018/07/23 15:32:00 ······· Skipping (existing): github.com/prometheus/client_model/go 2018/07/23 15:32:00 ······ Fetching recursive dependency: gopkg.in/validator.v2 2018/07/23 15:32:06 ······ Fetching recursive dependency: github.com/cactus/go-statsd-client/statsd 2018/07/23 15:32:08 ······ Skipping (existing): gopkg.in/yaml.v2 2018/07/23 15:32:08 ······ Fetching recursive dependency: github.com/m3db/prometheus_client_golang/prometheus 2018/07/23 15:32:08 ······· Skipping (existing): github.com/prometheus/procfs 2018/07/23 15:32:08 ······· Skipping (existing): github.com/prometheus/client_model/go 2018/07/23 15:32:08 ······· Skipping (existing): github.com/prometheus/common/expfmt 2018/07/23 15:32:08 ······· Skipping (existing): golang.org/x/net/context 2018/07/23 15:32:08 ······· Skipping (existing): github.com/beorn7/perks/quantile 2018/07/23 15:32:08 ······· Skipping (existing): github.com/golang/protobuf/proto 2018/07/23 15:32:08 ······· Skipping (existing): github.com/prometheus/common/model 2018/07/23 15:32:08 ······· Skipping (existing): github.com/prometheus/client_golang/prometheus 2018/07/23 15:32:08 ······ Fetching recursive dependency: github.com/apache/thrift/lib/go/thrift 2018/07/23 15:32:13 ····· Skipping (existing): github.com/stretchr/testify/assert 2018/07/23 15:32:13 ····· Fetching recursive dependency: github.com/go-kit/kit/metrics/influx 2018/07/23 15:32:13 ······ Fetching recursive dependency: github.com/influxdata/influxdb/client/v2 2018/07/23 15:32:17 ······· Fetching recursive dependency: github.com/influxdata/influxdb/models 2018/07/23 15:32:17 ········ Fetching recursive dependency: github.com/influxdata/influxdb/pkg/escape 2018/07/23 15:32:17 ······ Fetching recursive dependency: github.com/go-kit/kit/metrics 2018/07/23 15:32:17 ······· Fetching recursive dependency: github.com/performancecopilot/speed 2018/07/23 15:32:19 ······· Fetching recursive dependency: github.com/aws/aws-sdk-go-v2/aws 2018/07/23 15:32:28 ········ Fetching recursive dependency: github.com/aws/aws-sdk-go-v2/internal/sdk 2018/07/23 15:32:28 ········ Skipping (existing): github.com/go-ini/ini 2018/07/23 15:32:28 ········ Fetching recursive dependency: github.com/aws/aws-sdk-go-v2/service/sts 2018/07/23 15:32:28 ········· Fetching recursive dependency: github.com/aws/aws-sdk-go-v2/private/protocol/query 2018/07/23 15:32:28 ·········· Fetching recursive dependency: github.com/aws/aws-sdk-go-v2/private/protocol 2018/07/23 15:32:28 ········· Fetching recursive dependency: github.com/aws/aws-sdk-go-v2/internal/awsutil 2018/07/23 15:32:28 ·········· Skipping (existing): github.com/jmespath/go-jmespath 2018/07/23 15:32:28 ······· Fetching recursive dependency: github.com/aws/aws-sdk-go-v2/service/cloudwatch 2018/07/23 15:32:29 ······· Skipping (existing): github.com/aws/aws-sdk-go/aws 2018/07/23 15:32:29 ······· Skipping (existing): github.com/prometheus/client_golang/prometheus 2018/07/23 15:32:29 ······· Skipping (existing): github.com/aws/aws-sdk-go/service/cloudwatch 2018/07/23 15:32:29 ······· Skipping (existing): github.com/aws/aws-sdk-go/service/cloudwatch/cloudwatchiface 2018/07/23 15:32:29 ······· Fetching recursive dependency: golang.org/x/sync/errgroup 2018/07/23 15:32:31 ········ Skipping (existing): golang.org/x/net/context 2018/07/23 15:32:31 ······· Fetching recursive dependency: github.com/go-kit/kit/util/conn 2018/07/23 15:32:31 ······· Fetching recursive dependency: github.com/VividCortex/gohistogram 2018/07/23 15:32:33 ····· Skipping (existing): github.com/prometheus/client_golang/prometheus 2018/07/23 15:32:33 ····· Fetching recursive dependency: github.com/codahale/hdrhistogram 2018/07/23 15:32:35 ·· Skipping (existing): github.com/opentracing/opentracing-go 2018/07/23 15:32:35 · Fetching recursive dependency: github.com/mwitkow/go-grpc-middleware 2018/07/23 15:32:37 ·· Fetching recursive dependency: github.com/grpc-ecosystem/go-grpc-middleware/logging 2018/07/23 15:32:39 ··· Fetching recursive dependency: github.com/grpc-ecosystem/go-grpc-middleware 2018/07/23 15:32:39 ···· Fetching recursive dependency: github.com/golang/protobuf/jsonpb 2018/07/23 15:32:42 ····· Skipping (existing): github.com/golang/protobuf/ptypes/timestamp 2018/07/23 15:32:42 ····· Skipping (existing): github.com/golang/protobuf/proto 2018/07/23 15:32:42 ····· Skipping (existing): github.com/golang/protobuf/ptypes/duration 2018/07/23 15:32:42 ····· Skipping (existing): github.com/golang/protobuf/ptypes/any 2018/07/23 15:32:42 ····· Skipping (existing): github.com/golang/protobuf/ptypes/struct 2018/07/23 15:32:42 ····· Skipping (existing): github.com/golang/protobuf/ptypes/wrappers 2018/07/23 15:32:42 ···· Skipping (existing): google.golang.org/grpc/metadata 2018/07/23 15:32:42 ···· Fetching recursive dependency: github.com/stretchr/testify/suite 2018/07/23 15:32:45 ····· Skipping (existing): github.com/stretchr/testify/assert 2018/07/23 15:32:45 ····· Fetching recursive dependency: github.com/stretchr/testify/require 2018/07/23 15:32:45 ······ Skipping (existing): github.com/stretchr/testify/assert 2018/07/23 15:32:45 ···· Skipping (existing): google.golang.org/grpc/peer 2018/07/23 15:32:45 ···· Skipping (existing): golang.org/x/net/context 2018/07/23 15:32:45 ···· Skipping (existing): golang.org/x/net/trace 2018/07/23 15:32:45 ···· Fetching recursive dependency: github.com/gogo/protobuf/gogoproto 2018/07/23 15:32:48 ····· Fetching recursive dependency: github.com/gogo/protobuf/protoc-gen-gogo/descriptor 2018/07/23 15:32:48 ······ Skipping (existing): github.com/gogo/protobuf/proto 2018/07/23 15:32:48 ····· Skipping (existing): github.com/gogo/protobuf/proto 2018/07/23 15:32:48 ···· Skipping (existing): google.golang.org/grpc/credentials 2018/07/23 15:32:48 ···· Skipping (existing): google.golang.org/grpc 2018/07/23 15:32:48 ···· Skipping (existing): github.com/opentracing/opentracing-go 2018/07/23 15:32:48 ···· Skipping (existing): google.golang.org/grpc/codes 2018/07/23 15:32:48 ···· Skipping (existing): github.com/golang/protobuf/proto 2018/07/23 15:32:48 ···· Skipping (existing): google.golang.org/grpc/grpclog 2018/07/23 15:32:48 ···· Skipping (existing): github.com/opentracing/opentracing-go/ext 2018/07/23 15:32:48 ···· Skipping (existing): github.com/opentracing/opentracing-go/log 2018/07/23 15:32:48 ··· Skipping (existing): golang.org/x/net/context 2018/07/23 15:32:48 ··· Skipping (existing): google.golang.org/grpc 2018/07/23 15:32:48 ··· Skipping (existing): google.golang.org/grpc/grpclog 2018/07/23 15:32:48 ··· Skipping (existing): google.golang.org/grpc/codes 2018/07/23 15:32:48 ··· Skipping (existing): github.com/golang/protobuf/proto 2018/07/23 15:32:48 ·· Skipping (existing): github.com/opentracing/opentracing-go 2018/07/23 15:32:48 ·· Skipping (existing): google.golang.org/grpc 2018/07/23 15:32:48 ·· Skipping (existing): golang.org/x/net/context 2018/07/23 15:32:48 ·· Skipping (existing): google.golang.org/grpc/codes 2018/07/23 15:32:48 ·· Skipping (existing): google.golang.org/grpc/grpclog 2018/07/23 15:32:48 ·· Skipping (existing): github.com/opentracing/opentracing-go/log 2018/07/23 15:32:48 ·· Skipping (existing): google.golang.org/grpc/metadata 2018/07/23 15:32:48 ·· Skipping (existing): google.golang.org/grpc/peer 2018/07/23 15:32:48 ·· Skipping (existing): google.golang.org/grpc/credentials 2018/07/23 15:32:48 ·· Skipping (existing): github.com/golang/protobuf/proto 2018/07/23 15:32:48 ·· Skipping (existing): golang.org/x/net/trace 2018/07/23 15:32:48 ·· Skipping (existing): github.com/opentracing/opentracing-go/ext 2018/07/23 15:32:48 · Fetching recursive dependency: github.com/weaveworks/promrus 2018/07/23 15:32:53 ·· Skipping (existing): gopkg.in/yaml.v2 2018/07/23 15:32:53 ·· Skipping (existing): golang.org/x/net/context/ctxhttp 2018/07/23 15:32:53 ·· Fetching recursive dependency: github.com/stretchr/objx 2018/07/23 15:32:55 ·· Fetching recursive dependency: gopkg.in/alecthomas/kingpin.v2 2018/07/23 15:32:58 ··· Fetching recursive dependency: github.com/alecthomas/units 2018/07/23 15:33:00 ··· Fetching recursive dependency: github.com/alecthomas/template 2018/07/23 15:33:02 ·· Fetching recursive dependency: github.com/julienschmidt/httprouter 2018/07/23 15:33:05 ·· Skipping (existing): golang.org/x/net/context 2018/07/23 15:33:05 · Skipping (existing): github.com/aws/aws-sdk-go/aws/credentials 2018/07/23 15:33:05 · Skipping (existing): github.com/golang/protobuf/ptypes/empty 2018/07/23 15:33:05 · Skipping (existing): golang.org/x/net/context 2018/07/23 15:33:05 · Skipping (existing): golang.org/x/tools/cover 2018/07/23 15:33:05 · Skipping (existing): github.com/mgutz/ansi ```
266 lines
8.1 KiB
Go
266 lines
8.1 KiB
Go
// Package validator implements value validations
|
|
//
|
|
// Copyright 2014 Roberto Teixeira <robteix@robteix.com>
|
|
//
|
|
// Licensed under the Apache License, Version 2.0 (the "License");
|
|
// you may not use this file except in compliance with the License.
|
|
// You may obtain a copy of the License at
|
|
//
|
|
// http://www.apache.org/licenses/LICENSE-2.0
|
|
//
|
|
// Unless required by applicable law or agreed to in writing, software
|
|
// distributed under the License is distributed on an "AS IS" BASIS,
|
|
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
// See the License for the specific language governing permissions and
|
|
// limitations under the License.
|
|
|
|
/*
|
|
Package validator implements value validations based on struct tags.
|
|
|
|
In code it is often necessary to validate that a given value is valid before
|
|
using it for something. A typical example might be something like this.
|
|
|
|
if age < 18 {
|
|
return error.New("age cannot be under 18")
|
|
}
|
|
|
|
This is a simple enough example, but it can get significantly more complex,
|
|
especially when dealing with structs.
|
|
|
|
l := len(strings.Trim(s.Username))
|
|
if l < 3 || l > 40 || !regexp.MatchString("^[a-zA-Z]$", s.Username) || s.Age < 18 || s.Password {
|
|
return errors.New("Invalid request")
|
|
}
|
|
|
|
You get the idea. Package validator allows one to define valid values as
|
|
struct tags when defining a new struct type.
|
|
|
|
type NewUserRequest struct {
|
|
Username string `validate:"min=3,max=40,regexp=^[a-zA-Z]*$"`
|
|
Name string `validate:"nonzero"`
|
|
Age int `validate:"min=18"`
|
|
Password string `validate:"min=8"`
|
|
}
|
|
|
|
Then validating a variable of type NewUserRequest becomes trivial.
|
|
|
|
nur := NewUserRequest{Username: "something", ...}
|
|
if errs := validator.Validate(nur); errs != nil {
|
|
// do something
|
|
}
|
|
|
|
Builtin validator functions
|
|
|
|
Here is the list of validator functions builtin in the package.
|
|
|
|
len
|
|
For numeric numbers, len will simply make sure that the value is
|
|
equal to the parameter given. For strings, it checks that
|
|
the string length is exactly that number of characters. For slices,
|
|
arrays, and maps, validates the number of items. (Usage: len=10)
|
|
|
|
max
|
|
For numeric numbers, max will simply make sure that the value is
|
|
lesser or equal to the parameter given. For strings, it checks that
|
|
the string length is at most that number of characters. For slices,
|
|
arrays, and maps, validates the number of items. (Usage: max=10)
|
|
|
|
min
|
|
For numeric numbers, min will simply make sure that the value is
|
|
greater or equal to the parameter given. For strings, it checks that
|
|
the string length is at least that number of characters. For slices,
|
|
arrays, and maps, validates the number of items. (Usage: min=10)
|
|
|
|
nonzero
|
|
This validates that the value is not zero. The appropriate zero value
|
|
is given by the Go spec (e.g. for int it's 0, for string it's "", for
|
|
pointers is nil, etc.) Usage: nonzero
|
|
|
|
regexp
|
|
Only valid for string types, it will validate that the value matches
|
|
the regular expression provided as parameter. (Usage: regexp=^a.*b$)
|
|
|
|
|
|
Note that there are no tests to prevent conflicting validator parameters. For
|
|
instance, these fields will never be valid.
|
|
|
|
...
|
|
A int `validate:"max=0,min=1"`
|
|
B string `validate:"len=10,regexp=^$"
|
|
...
|
|
|
|
Custom validation functions
|
|
|
|
It is possible to define custom validation functions by using SetValidationFunc.
|
|
First, one needs to create a validation function.
|
|
|
|
// Very simple validation func
|
|
func notZZ(v interface{}, param string) error {
|
|
st := reflect.ValueOf(v)
|
|
if st.Kind() != reflect.String {
|
|
return validate.ErrUnsupported
|
|
}
|
|
if st.String() == "ZZ" {
|
|
return errors.New("value cannot be ZZ")
|
|
}
|
|
return nil
|
|
}
|
|
|
|
Then one needs to add it to the list of validation funcs and give it a "tag" name.
|
|
|
|
validate.SetValidationFunc("notzz", notZZ)
|
|
|
|
Then it is possible to use the notzz validation tag. This will print
|
|
"Field A error: value cannot be ZZ"
|
|
|
|
type T struct {
|
|
A string `validate:"nonzero,notzz"`
|
|
}
|
|
t := T{"ZZ"}
|
|
if errs := validator.Validate(t); errs != nil {
|
|
fmt.Printf("Field A error: %s\n", errs["A"][0])
|
|
}
|
|
|
|
To use parameters, it is very similar.
|
|
|
|
// Very simple validator with parameter
|
|
func notSomething(v interface{}, param string) error {
|
|
st := reflect.ValueOf(v)
|
|
if st.Kind() != reflect.String {
|
|
return validate.ErrUnsupported
|
|
}
|
|
if st.String() == param {
|
|
return errors.New("value cannot be " + param)
|
|
}
|
|
return nil
|
|
}
|
|
|
|
And then the code below should print "Field A error: value cannot be ABC".
|
|
|
|
validator.SetValidationFunc("notsomething", notSomething)
|
|
type T struct {
|
|
A string `validate:"notsomething=ABC"`
|
|
}
|
|
t := T{"ABC"}
|
|
if errs := validator.Validate(t); errs != nil {
|
|
fmt.Printf("Field A error: %s\n", errs["A"][0])
|
|
}
|
|
|
|
As well, it is possible to overwrite builtin validation functions.
|
|
|
|
validate.SetValidationFunc("min", myMinFunc)
|
|
|
|
And you can delete a validation function by setting it to nil.
|
|
|
|
validate.SetValidationFunc("notzz", nil)
|
|
validate.SetValidationFunc("nonzero", nil)
|
|
|
|
Using a non-existing validation func in a field tag will always return
|
|
false and with error validate.ErrUnknownTag.
|
|
|
|
Finally, package validator also provides a helper function that can be used
|
|
to validate simple variables/values.
|
|
|
|
// errs: nil
|
|
errs = validator.Valid(42, "min=10, max=50")
|
|
|
|
// errs: [validate.ErrZeroValue]
|
|
errs = validator.Valid(nil, "nonzero")
|
|
|
|
// errs: [validate.ErrMin,validate.ErrMax]
|
|
errs = validator.Valid("hi", "nonzero,min=3,max=2")
|
|
|
|
Custom tag name
|
|
|
|
In case there is a reason why one would not wish to use tag 'validate' (maybe due to
|
|
a conflict with a different package), it is possible to tell the package to use
|
|
a different tag.
|
|
|
|
validator.SetTag("valid")
|
|
|
|
Then.
|
|
|
|
Type T struct {
|
|
A int `valid:"min=8, max=10"`
|
|
B string `valid:"nonzero"`
|
|
}
|
|
|
|
SetTag is permanent. The new tag name will be used until it is again changed
|
|
with a new call to SetTag. A way to temporarily use a different tag exists.
|
|
|
|
validator.WithTag("foo").Validate(t)
|
|
validator.WithTag("bar").Validate(t)
|
|
// But this will go back to using 'validate'
|
|
validator.Validate(t)
|
|
|
|
Multiple validators
|
|
|
|
You may often need to have a different set of validation
|
|
rules for different situations. In all the examples above,
|
|
we only used the default validator but you could create a
|
|
new one and set specific rules for it.
|
|
|
|
For instance, you might use the same struct to decode incoming JSON for a REST API
|
|
but your needs will change when you're using it to, say, create a new instance
|
|
in storage vs. when you need to change something.
|
|
|
|
type User struct {
|
|
Username string `validate:"nonzero"`
|
|
Name string `validate:"nonzero"`
|
|
Age int `validate:"nonzero"`
|
|
Password string `validate:"nonzero"`
|
|
}
|
|
|
|
Maybe when creating a new user, you need to make sure all values in the struct are filled,
|
|
but then you use the same struct to handle incoming requests to, say, change the password,
|
|
in which case you only need the Username and the Password and don't care for the others.
|
|
You might use two different validators.
|
|
|
|
type User struct {
|
|
Username string `creating:"nonzero" chgpw:"nonzero"`
|
|
Name string `creating:"nonzero"`
|
|
Age int `creating:"nonzero"`
|
|
Password string `creating:"nonzero" chgpw:"nonzero"`
|
|
}
|
|
|
|
var (
|
|
creationValidator = validator.NewValidator()
|
|
chgPwValidator = validator.NewValidator()
|
|
)
|
|
|
|
func init() {
|
|
creationValidator.SetTag("creating")
|
|
chgPwValidator.SetTag("chgpw")
|
|
}
|
|
|
|
...
|
|
|
|
func CreateUserHandler(w http.ResponseWriter, r *http.Request) {
|
|
var u User
|
|
json.NewDecoder(r.Body).Decode(&user)
|
|
if errs := creationValidator.Validate(user); errs != nil {
|
|
// the request did not include all of the User
|
|
// struct fields, so send a http.StatusBadRequest
|
|
// back or something
|
|
}
|
|
// create the new user
|
|
}
|
|
|
|
func SetNewUserPasswordHandler(w http.ResponseWriter, r *http.Request) {
|
|
var u User
|
|
json.NewDecoder(r.Body).Decode(&user)
|
|
if errs := chgPwValidator.Validate(user); errs != nil {
|
|
// the request did not Username and Password,
|
|
// so send a http.StatusBadRequest
|
|
// back or something
|
|
}
|
|
// save the new password
|
|
}
|
|
|
|
It is also possible to do all of that using only the default validator as long
|
|
as SetTag is always called before calling validator.Validate() or you chain the
|
|
with WithTag().
|
|
|
|
*/
|
|
package validator
|