Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
二次元的罪恶王冠
beego
提交
aba1728b
B
beego
项目概览
二次元的罪恶王冠
/
beego
与 Fork 源项目一致
从无法访问的项目Fork
通知
1
Star
0
Fork
0
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
B
beego
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
提交
Issue看板
体验新版 GitCode,发现更多精彩内容 >>
提交
aba1728b
编写于
7月 23, 2013
作者:
M
miraclesu
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
add some util funcs
上级
ddb9ed39
变更
2
隐藏空白更改
内联
并排
Showing
2 changed file
with
189 addition
and
0 deletion
+189
-0
validation/util.go
validation/util.go
+131
-0
validation/util_test.go
validation/util_test.go
+58
-0
未找到文件。
validation/util.go
0 → 100644
浏览文件 @
aba1728b
package
validation
import
(
"fmt"
"reflect"
"strings"
)
const
(
VALIDTAG
=
"valid"
)
var
(
// key: function name
// value: the number of parameters
funcs
=
make
(
map
[
string
]
int
)
// doesn't belong to validation functions
unFuncs
=
map
[
string
]
bool
{
"Clear"
:
true
,
"HasErrors"
:
true
,
"ErrorMap"
:
true
,
"Error"
:
true
,
"apply"
:
true
,
"Check"
:
true
,
"Valid"
:
true
,
}
)
func
init
()
{
v
:=
&
Validation
{}
t
:=
reflect
.
TypeOf
(
v
)
for
i
:=
0
;
i
<
t
.
NumMethod
();
i
++
{
m
:=
t
.
Method
(
i
)
if
!
unFuncs
[
m
.
Name
]
{
funcs
[
m
.
Name
]
=
m
.
Type
.
NumIn
()
-
3
}
}
}
type
ValidFunc
struct
{
Name
string
Params
[]
interface
{}
}
func
isStruct
(
t
reflect
.
Type
)
bool
{
return
t
.
Kind
()
==
reflect
.
Struct
}
func
isStructPtr
(
t
reflect
.
Type
)
bool
{
return
t
.
Kind
()
==
reflect
.
Ptr
&&
t
.
Elem
()
.
Kind
()
==
reflect
.
Struct
}
func
getValidFuncs
(
f
reflect
.
StructField
)
(
vfs
[]
ValidFunc
,
err
error
)
{
tag
:=
f
.
Tag
.
Get
(
VALIDTAG
)
if
len
(
tag
)
==
0
{
return
}
fs
:=
strings
.
Split
(
tag
,
";"
)
for
_
,
vfunc
:=
range
fs
{
var
vf
ValidFunc
vf
,
err
=
parseFunc
(
vfunc
)
if
err
!=
nil
{
return
}
vfs
=
append
(
vfs
,
vf
)
}
return
}
func
parseFunc
(
vfunc
string
)
(
v
ValidFunc
,
err
error
)
{
defer
func
()
{
if
r
:=
recover
();
r
!=
nil
{
err
=
r
.
(
error
)
}
}()
vfunc
=
strings
.
TrimSpace
(
vfunc
)
start
:=
strings
.
Index
(
vfunc
,
"("
)
var
num
int
// doesn't need parameter valid function
if
start
==
-
1
{
if
num
,
err
=
numIn
(
vfunc
);
err
!=
nil
{
return
}
if
num
!=
0
{
err
=
fmt
.
Errorf
(
"%s require %d parameters"
,
vfunc
,
num
)
return
}
v
=
ValidFunc
{
Name
:
vfunc
}
return
}
end
:=
strings
.
Index
(
vfunc
,
")"
)
if
end
==
-
1
{
err
=
fmt
.
Errorf
(
"invalid valid function"
)
return
}
name
:=
strings
.
TrimSpace
(
vfunc
[
:
start
])
if
num
,
err
=
numIn
(
name
);
err
!=
nil
{
return
}
params
:=
strings
.
Split
(
vfunc
[
start
+
1
:
end
],
","
)
// the num of param must be equal
if
num
!=
len
(
params
)
{
err
=
fmt
.
Errorf
(
"%s require %d parameters"
,
name
,
num
)
return
}
v
=
ValidFunc
{
name
,
trim
(
params
)}
return
}
func
numIn
(
name
string
)
(
num
int
,
err
error
)
{
num
,
ok
:=
funcs
[
name
]
if
!
ok
{
err
=
fmt
.
Errorf
(
"doesn't exsits %s valid function"
,
name
)
}
return
}
func
trim
(
s
[]
string
)
[]
interface
{}
{
ts
:=
make
([]
interface
{},
len
(
s
))
for
i
:=
0
;
i
<
len
(
s
);
i
++
{
ts
[
i
]
=
strings
.
TrimSpace
(
s
[
i
])
}
return
ts
}
validation/util_test.go
0 → 100644
浏览文件 @
aba1728b
package
validation
import
(
"reflect"
"testing"
)
type
user
struct
{
Id
int
Tag
string
`valid:"Maxx(aa)"`
Name
string
`valid:"Required"`
Age
int
`valid:"Required;Range(1, 140)"`
}
func
TestGetValidFuncs
(
t
*
testing
.
T
)
{
u
:=
user
{
Name
:
"test"
,
Age
:
1
}
tf
:=
reflect
.
TypeOf
(
u
)
var
vfs
[]
ValidFunc
var
err
error
f
,
_
:=
tf
.
FieldByName
(
"Id"
)
if
vfs
,
err
=
getValidFuncs
(
f
);
err
!=
nil
{
t
.
Fatal
(
err
)
}
if
len
(
vfs
)
!=
0
{
t
.
Fatal
(
"should get none ValidFunc"
)
}
f
,
_
=
tf
.
FieldByName
(
"Tag"
)
if
vfs
,
err
=
getValidFuncs
(
f
);
err
.
Error
()
!=
"doesn't exsits Maxx valid function"
{
t
.
Fatal
(
err
)
}
f
,
_
=
tf
.
FieldByName
(
"Name"
)
if
vfs
,
err
=
getValidFuncs
(
f
);
err
!=
nil
{
t
.
Fatal
(
err
)
}
if
len
(
vfs
)
!=
1
{
t
.
Fatal
(
"should get 1 ValidFunc"
)
}
if
vfs
[
0
]
.
Name
!=
"Required"
&&
len
(
vfs
[
0
]
.
Params
)
!=
0
{
t
.
Error
(
"Required funcs should be got"
)
}
f
,
_
=
tf
.
FieldByName
(
"Age"
)
if
vfs
,
err
=
getValidFuncs
(
f
);
err
!=
nil
{
t
.
Fatal
(
err
)
}
if
len
(
vfs
)
!=
2
{
t
.
Fatal
(
"should get 2 ValidFunc"
)
}
if
vfs
[
0
]
.
Name
!=
"Required"
&&
len
(
vfs
[
0
]
.
Params
)
!=
0
{
t
.
Error
(
"Required funcs should be got"
)
}
if
vfs
[
1
]
.
Name
!=
"Range"
&&
len
(
vfs
[
1
]
.
Params
)
!=
2
{
t
.
Error
(
"Range funcs should be got"
)
}
}
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录