Skip to content
Projects
Groups
Snippets
Help
Loading...
Sign in
Toggle navigation
B
beego
Project
Project
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Commits
Issue Boards
Open sidebar
go
beego
Commits
ea9c2ceb
Commit
ea9c2ceb
authored
Sep 10, 2013
by
slene
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
validation add more info to ValidationError, and put all messages tmpl to a map
parent
02a03cec
Show whitespace changes
Inline
Side-by-side
Showing
2 changed files
with
143 additions
and
21 deletions
+143
-21
validation.go
validation/validation.go
+20
-2
validators.go
validation/validators.go
+123
-19
No files found.
validation/validation.go
View file @
ea9c2ceb
...
@@ -4,10 +4,13 @@ import (
...
@@ -4,10 +4,13 @@ import (
"fmt"
"fmt"
"reflect"
"reflect"
"regexp"
"regexp"
"strings"
)
)
type
ValidationError
struct
{
type
ValidationError
struct
{
Message
,
Key
string
Message
,
Key
,
Name
,
Field
,
Tmpl
string
Value
interface
{}
LimitValue
interface
{}
}
}
// Returns the Message.
// Returns the Message.
...
@@ -170,9 +173,24 @@ func (v *Validation) apply(chk Validator, obj interface{}) *ValidationResult {
...
@@ -170,9 +173,24 @@ func (v *Validation) apply(chk Validator, obj interface{}) *ValidationResult {
}
}
// Add the error to the validation context.
// Add the error to the validation context.
key
:=
chk
.
GetKey
()
Name
:=
key
Field
:=
""
parts
:=
strings
.
Split
(
key
,
"."
)
if
len
(
parts
)
==
2
{
Field
=
parts
[
0
]
Name
=
parts
[
1
]
}
err
:=
&
ValidationError
{
err
:=
&
ValidationError
{
Message
:
chk
.
DefaultMessage
(),
Message
:
chk
.
DefaultMessage
(),
Key
:
chk
.
GetKey
(),
Key
:
key
,
Name
:
Name
,
Field
:
Field
,
Value
:
obj
,
Tmpl
:
MessageTmpls
[
Name
],
LimitValue
:
chk
.
GetLimitValue
(),
}
}
v
.
Errors
=
append
(
v
.
Errors
,
err
)
v
.
Errors
=
append
(
v
.
Errors
,
err
)
...
...
validation/validators.go
View file @
ea9c2ceb
...
@@ -7,10 +7,34 @@ import (
...
@@ -7,10 +7,34 @@ import (
"time"
"time"
)
)
var
MessageTmpls
=
map
[
string
]
string
{
"Required"
:
"Can not be empty"
,
"Min"
:
"Minimum is %d"
,
"Max"
:
"Maximum is %d"
,
"Range"
:
"Range is %d to %d"
,
"MinSize"
:
"Minimum size is %d"
,
"MaxSize"
:
"Maximum size is %d"
,
"Length"
:
"Required length is %d"
,
"Alpha"
:
"Must be valid alpha characters"
,
"Numeric"
:
"Must be valid numeric characters"
,
"AlphaNumeric"
:
"Must be valid alpha or numeric characters"
,
"Match"
:
"Must match %s"
,
"NoMatch"
:
"Must not match %s"
,
"AlphaDash"
:
"Must be valid alpha or numeric or dash(-_) characters"
,
"Email"
:
"Must be a valid email address"
,
"IP"
:
"Must be a valid ip address"
,
"Base64"
:
"Must be valid base64 characters"
,
"Mobile"
:
"Must be valid mobile number"
,
"Tel"
:
"Must be valid telephone number"
,
"Phone"
:
"Must be valid telephone or mobile phone number"
,
"ZipCode"
:
"Must be valid zipcode"
,
}
type
Validator
interface
{
type
Validator
interface
{
IsSatisfied
(
interface
{})
bool
IsSatisfied
(
interface
{})
bool
DefaultMessage
()
string
DefaultMessage
()
string
GetKey
()
string
GetKey
()
string
GetLimitValue
()
interface
{}
}
}
type
Required
struct
{
type
Required
struct
{
...
@@ -49,6 +73,10 @@ func (r Required) GetKey() string {
...
@@ -49,6 +73,10 @@ func (r Required) GetKey() string {
return
r
.
Key
return
r
.
Key
}
}
func
(
r
Required
)
GetLimitValue
()
interface
{}
{
return
nil
}
type
Min
struct
{
type
Min
struct
{
Min
int
Min
int
Key
string
Key
string
...
@@ -63,13 +91,17 @@ func (m Min) IsSatisfied(obj interface{}) bool {
...
@@ -63,13 +91,17 @@ func (m Min) IsSatisfied(obj interface{}) bool {
}
}
func
(
m
Min
)
DefaultMessage
()
string
{
func
(
m
Min
)
DefaultMessage
()
string
{
return
fmt
.
Sprint
(
"Minimum is "
,
m
.
Min
)
return
fmt
.
Sprint
f
(
MessageTmpls
[
"Min"
]
,
m
.
Min
)
}
}
func
(
m
Min
)
GetKey
()
string
{
func
(
m
Min
)
GetKey
()
string
{
return
m
.
Key
return
m
.
Key
}
}
func
(
m
Min
)
GetLimitValue
()
interface
{}
{
return
m
.
Min
}
type
Max
struct
{
type
Max
struct
{
Max
int
Max
int
Key
string
Key
string
...
@@ -84,13 +116,17 @@ func (m Max) IsSatisfied(obj interface{}) bool {
...
@@ -84,13 +116,17 @@ func (m Max) IsSatisfied(obj interface{}) bool {
}
}
func
(
m
Max
)
DefaultMessage
()
string
{
func
(
m
Max
)
DefaultMessage
()
string
{
return
fmt
.
Sprint
(
"Maximum is "
,
m
.
Max
)
return
fmt
.
Sprint
f
(
MessageTmpls
[
"Max"
]
,
m
.
Max
)
}
}
func
(
m
Max
)
GetKey
()
string
{
func
(
m
Max
)
GetKey
()
string
{
return
m
.
Key
return
m
.
Key
}
}
func
(
m
Max
)
GetLimitValue
()
interface
{}
{
return
m
.
Max
}
// Requires an integer to be within Min, Max inclusive.
// Requires an integer to be within Min, Max inclusive.
type
Range
struct
{
type
Range
struct
{
Min
Min
...
@@ -103,13 +139,17 @@ func (r Range) IsSatisfied(obj interface{}) bool {
...
@@ -103,13 +139,17 @@ func (r Range) IsSatisfied(obj interface{}) bool {
}
}
func
(
r
Range
)
DefaultMessage
()
string
{
func
(
r
Range
)
DefaultMessage
()
string
{
return
fmt
.
Sprint
(
"Range is "
,
r
.
Min
.
Min
,
" to "
,
r
.
Max
.
Max
)
return
fmt
.
Sprint
f
(
MessageTmpls
[
"Range"
],
r
.
Min
.
Min
,
r
.
Max
.
Max
)
}
}
func
(
r
Range
)
GetKey
()
string
{
func
(
r
Range
)
GetKey
()
string
{
return
r
.
Key
return
r
.
Key
}
}
func
(
r
Range
)
GetLimitValue
()
interface
{}
{
return
[]
int
{
r
.
Min
.
Min
,
r
.
Max
.
Max
}
}
// Requires an array or string to be at least a given length.
// Requires an array or string to be at least a given length.
type
MinSize
struct
{
type
MinSize
struct
{
Min
int
Min
int
...
@@ -128,13 +168,17 @@ func (m MinSize) IsSatisfied(obj interface{}) bool {
...
@@ -128,13 +168,17 @@ func (m MinSize) IsSatisfied(obj interface{}) bool {
}
}
func
(
m
MinSize
)
DefaultMessage
()
string
{
func
(
m
MinSize
)
DefaultMessage
()
string
{
return
fmt
.
Sprint
(
"Minimum size is "
,
m
.
Min
)
return
fmt
.
Sprint
f
(
MessageTmpls
[
"MinSize"
]
,
m
.
Min
)
}
}
func
(
m
MinSize
)
GetKey
()
string
{
func
(
m
MinSize
)
GetKey
()
string
{
return
m
.
Key
return
m
.
Key
}
}
func
(
m
MinSize
)
GetLimitValue
()
interface
{}
{
return
m
.
Min
}
// Requires an array or string to be at most a given length.
// Requires an array or string to be at most a given length.
type
MaxSize
struct
{
type
MaxSize
struct
{
Max
int
Max
int
...
@@ -153,13 +197,17 @@ func (m MaxSize) IsSatisfied(obj interface{}) bool {
...
@@ -153,13 +197,17 @@ func (m MaxSize) IsSatisfied(obj interface{}) bool {
}
}
func
(
m
MaxSize
)
DefaultMessage
()
string
{
func
(
m
MaxSize
)
DefaultMessage
()
string
{
return
fmt
.
Sprint
(
"Maximum size is "
,
m
.
Max
)
return
fmt
.
Sprint
f
(
MessageTmpls
[
"MaxSize"
]
,
m
.
Max
)
}
}
func
(
m
MaxSize
)
GetKey
()
string
{
func
(
m
MaxSize
)
GetKey
()
string
{
return
m
.
Key
return
m
.
Key
}
}
func
(
m
MaxSize
)
GetLimitValue
()
interface
{}
{
return
m
.
Max
}
// Requires an array or string to be exactly a given length.
// Requires an array or string to be exactly a given length.
type
Length
struct
{
type
Length
struct
{
N
int
N
int
...
@@ -178,13 +226,17 @@ func (l Length) IsSatisfied(obj interface{}) bool {
...
@@ -178,13 +226,17 @@ func (l Length) IsSatisfied(obj interface{}) bool {
}
}
func
(
l
Length
)
DefaultMessage
()
string
{
func
(
l
Length
)
DefaultMessage
()
string
{
return
fmt
.
Sprint
(
"Required length is "
,
l
.
N
)
return
fmt
.
Sprint
f
(
MessageTmpls
[
"Length"
]
,
l
.
N
)
}
}
func
(
l
Length
)
GetKey
()
string
{
func
(
l
Length
)
GetKey
()
string
{
return
l
.
Key
return
l
.
Key
}
}
func
(
l
Length
)
GetLimitValue
()
interface
{}
{
return
l
.
N
}
type
Alpha
struct
{
type
Alpha
struct
{
Key
string
Key
string
}
}
...
@@ -202,13 +254,17 @@ func (a Alpha) IsSatisfied(obj interface{}) bool {
...
@@ -202,13 +254,17 @@ func (a Alpha) IsSatisfied(obj interface{}) bool {
}
}
func
(
a
Alpha
)
DefaultMessage
()
string
{
func
(
a
Alpha
)
DefaultMessage
()
string
{
return
fmt
.
Sprint
(
"Must be valid alpha characters"
)
return
fmt
.
Sprint
(
MessageTmpls
[
"Alpha"
]
)
}
}
func
(
a
Alpha
)
GetKey
()
string
{
func
(
a
Alpha
)
GetKey
()
string
{
return
a
.
Key
return
a
.
Key
}
}
func
(
a
Alpha
)
GetLimitValue
()
interface
{}
{
return
nil
}
type
Numeric
struct
{
type
Numeric
struct
{
Key
string
Key
string
}
}
...
@@ -226,13 +282,17 @@ func (n Numeric) IsSatisfied(obj interface{}) bool {
...
@@ -226,13 +282,17 @@ func (n Numeric) IsSatisfied(obj interface{}) bool {
}
}
func
(
n
Numeric
)
DefaultMessage
()
string
{
func
(
n
Numeric
)
DefaultMessage
()
string
{
return
fmt
.
Sprint
(
"Must be valid numeric characters"
)
return
fmt
.
Sprint
(
MessageTmpls
[
"Numeric"
]
)
}
}
func
(
n
Numeric
)
GetKey
()
string
{
func
(
n
Numeric
)
GetKey
()
string
{
return
n
.
Key
return
n
.
Key
}
}
func
(
n
Numeric
)
GetLimitValue
()
interface
{}
{
return
nil
}
type
AlphaNumeric
struct
{
type
AlphaNumeric
struct
{
Key
string
Key
string
}
}
...
@@ -250,13 +310,17 @@ func (a AlphaNumeric) IsSatisfied(obj interface{}) bool {
...
@@ -250,13 +310,17 @@ func (a AlphaNumeric) IsSatisfied(obj interface{}) bool {
}
}
func
(
a
AlphaNumeric
)
DefaultMessage
()
string
{
func
(
a
AlphaNumeric
)
DefaultMessage
()
string
{
return
fmt
.
Sprint
(
"Must be valid alpha or numeric characters"
)
return
fmt
.
Sprint
(
MessageTmpls
[
"AlphaNumeric"
]
)
}
}
func
(
a
AlphaNumeric
)
GetKey
()
string
{
func
(
a
AlphaNumeric
)
GetKey
()
string
{
return
a
.
Key
return
a
.
Key
}
}
func
(
a
AlphaNumeric
)
GetLimitValue
()
interface
{}
{
return
nil
}
// Requires a string to match a given regex.
// Requires a string to match a given regex.
type
Match
struct
{
type
Match
struct
{
Regexp
*
regexp
.
Regexp
Regexp
*
regexp
.
Regexp
...
@@ -268,13 +332,17 @@ func (m Match) IsSatisfied(obj interface{}) bool {
...
@@ -268,13 +332,17 @@ func (m Match) IsSatisfied(obj interface{}) bool {
}
}
func
(
m
Match
)
DefaultMessage
()
string
{
func
(
m
Match
)
DefaultMessage
()
string
{
return
fmt
.
Sprint
(
"Must match "
,
m
.
Regexp
)
return
fmt
.
Sprint
f
(
MessageTmpls
[
"Match"
],
m
.
Regexp
.
String
()
)
}
}
func
(
m
Match
)
GetKey
()
string
{
func
(
m
Match
)
GetKey
()
string
{
return
m
.
Key
return
m
.
Key
}
}
func
(
m
Match
)
GetLimitValue
()
interface
{}
{
return
m
.
Regexp
.
String
()
}
// Requires a string to not match a given regex.
// Requires a string to not match a given regex.
type
NoMatch
struct
{
type
NoMatch
struct
{
Match
Match
...
@@ -286,13 +354,17 @@ func (n NoMatch) IsSatisfied(obj interface{}) bool {
...
@@ -286,13 +354,17 @@ func (n NoMatch) IsSatisfied(obj interface{}) bool {
}
}
func
(
n
NoMatch
)
DefaultMessage
()
string
{
func
(
n
NoMatch
)
DefaultMessage
()
string
{
return
fmt
.
Sprint
(
"Must not match "
,
n
.
Regexp
)
return
fmt
.
Sprint
f
(
MessageTmpls
[
"NoMatch"
],
n
.
Regexp
.
String
()
)
}
}
func
(
n
NoMatch
)
GetKey
()
string
{
func
(
n
NoMatch
)
GetKey
()
string
{
return
n
.
Key
return
n
.
Key
}
}
func
(
n
NoMatch
)
GetLimitValue
()
interface
{}
{
return
n
.
Regexp
.
String
()
}
var
alphaDashPattern
=
regexp
.
MustCompile
(
"[^
\\
d
\\
w-_]"
)
var
alphaDashPattern
=
regexp
.
MustCompile
(
"[^
\\
d
\\
w-_]"
)
type
AlphaDash
struct
{
type
AlphaDash
struct
{
...
@@ -301,13 +373,17 @@ type AlphaDash struct {
...
@@ -301,13 +373,17 @@ type AlphaDash struct {
}
}
func
(
a
AlphaDash
)
DefaultMessage
()
string
{
func
(
a
AlphaDash
)
DefaultMessage
()
string
{
return
fmt
.
Sprint
(
"Must be valid alpha or numeric or dash(-_) characters"
)
return
fmt
.
Sprint
(
MessageTmpls
[
"AlphaDash"
]
)
}
}
func
(
a
AlphaDash
)
GetKey
()
string
{
func
(
a
AlphaDash
)
GetKey
()
string
{
return
a
.
Key
return
a
.
Key
}
}
func
(
a
AlphaDash
)
GetLimitValue
()
interface
{}
{
return
nil
}
var
emailPattern
=
regexp
.
MustCompile
(
"[
\\
w!#$%&'*+/=?^_`{|}~-]+(?:
\\
.[
\\
w!#$%&'*+/=?^_`{|}~-]+)*@(?:[
\\
w](?:[
\\
w-]*[
\\
w])?
\\
.)+[a-zA-Z0-9](?:[
\\
w-]*[
\\
w])?"
)
var
emailPattern
=
regexp
.
MustCompile
(
"[
\\
w!#$%&'*+/=?^_`{|}~-]+(?:
\\
.[
\\
w!#$%&'*+/=?^_`{|}~-]+)*@(?:[
\\
w](?:[
\\
w-]*[
\\
w])?
\\
.)+[a-zA-Z0-9](?:[
\\
w-]*[
\\
w])?"
)
type
Email
struct
{
type
Email
struct
{
...
@@ -316,13 +392,17 @@ type Email struct {
...
@@ -316,13 +392,17 @@ type Email struct {
}
}
func
(
e
Email
)
DefaultMessage
()
string
{
func
(
e
Email
)
DefaultMessage
()
string
{
return
fmt
.
Sprint
(
"Must be a valid email address"
)
return
fmt
.
Sprint
(
MessageTmpls
[
"Email"
]
)
}
}
func
(
e
Email
)
GetKey
()
string
{
func
(
e
Email
)
GetKey
()
string
{
return
e
.
Key
return
e
.
Key
}
}
func
(
e
Email
)
GetLimitValue
()
interface
{}
{
return
nil
}
var
ipPattern
=
regexp
.
MustCompile
(
"^((2[0-4]
\\
d|25[0-5]|[01]?
\\
d
\\
d?)
\\
.){3}(2[0-4]
\\
d|25[0-5]|[01]?
\\
d
\\
d?)$"
)
var
ipPattern
=
regexp
.
MustCompile
(
"^((2[0-4]
\\
d|25[0-5]|[01]?
\\
d
\\
d?)
\\
.){3}(2[0-4]
\\
d|25[0-5]|[01]?
\\
d
\\
d?)$"
)
type
IP
struct
{
type
IP
struct
{
...
@@ -331,13 +411,17 @@ type IP struct {
...
@@ -331,13 +411,17 @@ type IP struct {
}
}
func
(
i
IP
)
DefaultMessage
()
string
{
func
(
i
IP
)
DefaultMessage
()
string
{
return
fmt
.
Sprint
(
"Must be a valid ip address"
)
return
fmt
.
Sprint
(
MessageTmpls
[
"IP"
]
)
}
}
func
(
i
IP
)
GetKey
()
string
{
func
(
i
IP
)
GetKey
()
string
{
return
i
.
Key
return
i
.
Key
}
}
func
(
i
IP
)
GetLimitValue
()
interface
{}
{
return
nil
}
var
base64Pattern
=
regexp
.
MustCompile
(
"^(?:[A-Za-z0-99+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$"
)
var
base64Pattern
=
regexp
.
MustCompile
(
"^(?:[A-Za-z0-99+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$"
)
type
Base64
struct
{
type
Base64
struct
{
...
@@ -346,13 +430,17 @@ type Base64 struct {
...
@@ -346,13 +430,17 @@ type Base64 struct {
}
}
func
(
b
Base64
)
DefaultMessage
()
string
{
func
(
b
Base64
)
DefaultMessage
()
string
{
return
fmt
.
Sprint
(
"Must be valid base64 characters"
)
return
fmt
.
Sprint
(
MessageTmpls
[
"Base64"
]
)
}
}
func
(
b
Base64
)
GetKey
()
string
{
func
(
b
Base64
)
GetKey
()
string
{
return
b
.
Key
return
b
.
Key
}
}
func
(
b
Base64
)
GetLimitValue
()
interface
{}
{
return
nil
}
// just for chinese mobile phone number
// just for chinese mobile phone number
var
mobilePattern
=
regexp
.
MustCompile
(
"^((
\\
+86)|(86))?(1(([35][0-9])|(47)|[8][01236789]))
\\
d{8}$"
)
var
mobilePattern
=
regexp
.
MustCompile
(
"^((
\\
+86)|(86))?(1(([35][0-9])|(47)|[8][01236789]))
\\
d{8}$"
)
...
@@ -362,13 +450,17 @@ type Mobile struct {
...
@@ -362,13 +450,17 @@ type Mobile struct {
}
}
func
(
m
Mobile
)
DefaultMessage
()
string
{
func
(
m
Mobile
)
DefaultMessage
()
string
{
return
fmt
.
Sprint
(
"Must be valid mobile number"
)
return
fmt
.
Sprint
(
MessageTmpls
[
"Mobile"
]
)
}
}
func
(
m
Mobile
)
GetKey
()
string
{
func
(
m
Mobile
)
GetKey
()
string
{
return
m
.
Key
return
m
.
Key
}
}
func
(
m
Mobile
)
GetLimitValue
()
interface
{}
{
return
nil
}
// just for chinese telephone number
// just for chinese telephone number
var
telPattern
=
regexp
.
MustCompile
(
"^(0
\\
d{2,3}(
\\
-)?)?
\\
d{7,8}$"
)
var
telPattern
=
regexp
.
MustCompile
(
"^(0
\\
d{2,3}(
\\
-)?)?
\\
d{7,8}$"
)
...
@@ -378,13 +470,17 @@ type Tel struct {
...
@@ -378,13 +470,17 @@ type Tel struct {
}
}
func
(
t
Tel
)
DefaultMessage
()
string
{
func
(
t
Tel
)
DefaultMessage
()
string
{
return
fmt
.
Sprint
(
"Must be valid telephone number"
)
return
fmt
.
Sprint
(
MessageTmpls
[
"Tel"
]
)
}
}
func
(
t
Tel
)
GetKey
()
string
{
func
(
t
Tel
)
GetKey
()
string
{
return
t
.
Key
return
t
.
Key
}
}
func
(
t
Tel
)
GetLimitValue
()
interface
{}
{
return
nil
}
// just for chinese telephone or mobile phone number
// just for chinese telephone or mobile phone number
type
Phone
struct
{
type
Phone
struct
{
Mobile
Mobile
...
@@ -397,13 +493,17 @@ func (p Phone) IsSatisfied(obj interface{}) bool {
...
@@ -397,13 +493,17 @@ func (p Phone) IsSatisfied(obj interface{}) bool {
}
}
func
(
p
Phone
)
DefaultMessage
()
string
{
func
(
p
Phone
)
DefaultMessage
()
string
{
return
fmt
.
Sprint
(
"Must be valid telephone or mobile phone number"
)
return
fmt
.
Sprint
(
MessageTmpls
[
"Phone"
]
)
}
}
func
(
p
Phone
)
GetKey
()
string
{
func
(
p
Phone
)
GetKey
()
string
{
return
p
.
Key
return
p
.
Key
}
}
func
(
p
Phone
)
GetLimitValue
()
interface
{}
{
return
nil
}
// just for chinese zipcode
// just for chinese zipcode
var
zipCodePattern
=
regexp
.
MustCompile
(
"^[1-9]
\\
d{5}$"
)
var
zipCodePattern
=
regexp
.
MustCompile
(
"^[1-9]
\\
d{5}$"
)
...
@@ -413,9 +513,13 @@ type ZipCode struct {
...
@@ -413,9 +513,13 @@ type ZipCode struct {
}
}
func
(
z
ZipCode
)
DefaultMessage
()
string
{
func
(
z
ZipCode
)
DefaultMessage
()
string
{
return
fmt
.
Sprint
(
"Must be valid zipcode"
)
return
fmt
.
Sprint
(
MessageTmpls
[
"ZipCode"
]
)
}
}
func
(
z
ZipCode
)
GetKey
()
string
{
func
(
z
ZipCode
)
GetKey
()
string
{
return
z
.
Key
return
z
.
Key
}
}
func
(
z
ZipCode
)
GetLimitValue
()
interface
{}
{
return
nil
}
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment