修复数据验证的BUG + 升级不同类型数据默认值的获取

This commit is contained in:
白茶清欢 2025-03-21 18:48:05 +08:00
parent be6b8e644f
commit f42606bf68
4 changed files with 26 additions and 24 deletions

6
go.mod
View File

@ -3,9 +3,9 @@ module git.zhangdeman.cn/gateway/validate
go 1.24.1
require (
git.zhangdeman.cn/zhangdeman/consts v0.0.0-20250227040546-863c03f34bb8
git.zhangdeman.cn/zhangdeman/consts v0.0.0-20250321102241-d6e86b64f7ca
git.zhangdeman.cn/zhangdeman/dynamic-struct v0.0.0-20250319072714-eab2a7abde63
git.zhangdeman.cn/zhangdeman/json_filter v0.0.0-20241205105007-b8c8c9d4338c
git.zhangdeman.cn/zhangdeman/json_filter v0.0.0-20250321103029-786c03293a28
git.zhangdeman.cn/zhangdeman/serialize v0.0.0-20241223084948-de2e49144fcd
github.com/go-playground/validator/v10 v10.25.0
github.com/tidwall/gjson v1.18.0
@ -15,7 +15,7 @@ require (
require (
git.zhangdeman.cn/zhangdeman/op_type v0.0.0-20240122104027-4928421213c0 // indirect
git.zhangdeman.cn/zhangdeman/util v0.0.0-20240618042405-6ee2c904644e // indirect
git.zhangdeman.cn/zhangdeman/wrapper v0.0.0-20250302133417-c1588abcb436 // indirect
git.zhangdeman.cn/zhangdeman/wrapper v0.0.0-20250321102712-1cbfbe959740 // indirect
github.com/BurntSushi/toml v1.5.0 // indirect
github.com/axgle/mahonia v0.0.0-20180208002826-3358181d7394 // indirect
github.com/gabriel-vasile/mimetype v1.4.8 // indirect

8
go.sum
View File

@ -1,7 +1,13 @@
git.zhangdeman.cn/zhangdeman/consts v0.0.0-20250227040546-863c03f34bb8 h1:VEifPc+vkpEQoX9rj7zxmT1m+IA81XjOxe7+Z1aqWNM=
git.zhangdeman.cn/zhangdeman/consts v0.0.0-20250227040546-863c03f34bb8/go.mod h1:IXXaZkb7vGzGnGM5RRWrASAuwrVSNxuoe0DmeXx5g6k=
git.zhangdeman.cn/zhangdeman/consts v0.0.0-20250321101544-734d9a9f7733 h1:j5tG00W5C+1kYLJV73Iw3wvMo212x4taUHGolf3kikQ=
git.zhangdeman.cn/zhangdeman/consts v0.0.0-20250321101544-734d9a9f7733/go.mod h1:IXXaZkb7vGzGnGM5RRWrASAuwrVSNxuoe0DmeXx5g6k=
git.zhangdeman.cn/zhangdeman/consts v0.0.0-20250321102241-d6e86b64f7ca h1:uxjzbY5fDozjyK6jkoQtuQouVTcVfXjbe3chARYSjRM=
git.zhangdeman.cn/zhangdeman/consts v0.0.0-20250321102241-d6e86b64f7ca/go.mod h1:IXXaZkb7vGzGnGM5RRWrASAuwrVSNxuoe0DmeXx5g6k=
git.zhangdeman.cn/zhangdeman/json_filter v0.0.0-20241205105007-b8c8c9d4338c h1:y8WLSdY8dBkKmazLt/XokW/LGz3hbdvNUdCUnsWXpRw=
git.zhangdeman.cn/zhangdeman/json_filter v0.0.0-20241205105007-b8c8c9d4338c/go.mod h1:GzCzTobrpI6J94Cluj9gjN/o5ZdNEyrXQcfGfj05ohs=
git.zhangdeman.cn/zhangdeman/json_filter v0.0.0-20250321103029-786c03293a28 h1:wzEv9TXimkXuvjIgLuU+JETmWzj3AjfS3JA2cvU51xM=
git.zhangdeman.cn/zhangdeman/json_filter v0.0.0-20250321103029-786c03293a28/go.mod h1:RHYpM8BsZg9CuK78oY0+/n3g4kHMXk04+Gj1Sfg6E3U=
git.zhangdeman.cn/zhangdeman/op_type v0.0.0-20240122104027-4928421213c0 h1:gUDlQMuJ4xNfP2Abl1Msmpa3fASLWYkNlqDFF/6GN0Y=
git.zhangdeman.cn/zhangdeman/op_type v0.0.0-20240122104027-4928421213c0/go.mod h1:VHb9qmhaPDAQDcS6vUiDCamYjZ4R5lD1XtVsh55KsMI=
git.zhangdeman.cn/zhangdeman/serialize v0.0.0-20241223084948-de2e49144fcd h1:q7GG14qgXKB4MEXQFOe7/UYebsqMfPaSX80TcPdOosI=
@ -10,6 +16,8 @@ git.zhangdeman.cn/zhangdeman/util v0.0.0-20240618042405-6ee2c904644e h1:Q973S6Cc
git.zhangdeman.cn/zhangdeman/util v0.0.0-20240618042405-6ee2c904644e/go.mod h1:VpPjBlwz8U+OxZuxzHQBv1aEEZ3pStH6bZvT21ADEbI=
git.zhangdeman.cn/zhangdeman/wrapper v0.0.0-20250302133417-c1588abcb436 h1:SM4zc54W2wmM72+4pMNQ8iS371H6lj4J8rj8KJKf7pw=
git.zhangdeman.cn/zhangdeman/wrapper v0.0.0-20250302133417-c1588abcb436/go.mod h1:YJ1FlvFgkfAHkxkt3l5rKKUqEpQkNMbCFDzDmgteEU8=
git.zhangdeman.cn/zhangdeman/wrapper v0.0.0-20250321102712-1cbfbe959740 h1:zPUoylfJTbc0EcxW+NEzOTBmoeFZ2I/rLFBnEzxb4Wk=
git.zhangdeman.cn/zhangdeman/wrapper v0.0.0-20250321102712-1cbfbe959740/go.mod h1:1ct92dbVc49pmXusA/iGfcQUJzcYmJ+cjAhgc3sDv1I=
github.com/BurntSushi/toml v1.5.0 h1:W5quZX/G/csjUnuI8SUYlsHs9M38FC7znL0lIO+DvMg=
github.com/BurntSushi/toml v1.5.0/go.mod h1:ukJfTF/6rtPPRCnwkur4qwRxa8vTRFBF0uk2lLoLwho=
github.com/axgle/mahonia v0.0.0-20180208002826-3358181d7394 h1:OYA+5W64v3OgClL+IrOD63t4i/RW7RqrAVl9LTZ9UqQ=

View File

@ -88,19 +88,14 @@ func (h *handle) Run() ([]byte, error) {
Args: nil,
})
}
sourceValue, err := h.getSourceDataValue(field)
if nil != err {
// 格式化数据
if _, err := h.formatDataValue(field); nil != err {
return nil, err
}
// 支持嵌套结构体
fieldTag := h.generateTag(field)
if nil == sourceValue {
// 没出现异常, 但是value为nil, 视作参数不存在处理
// TODO: 这里需要设置为对应类型的零值
h.dynamicStruct.AddField(field.JsonTag, "", "", fieldTag, false)
continue
}
h.dynamicStruct.AddField(field.JsonTag, "", sourceValue, fieldTag, false)
// 这里需要设置为对应类型的零值就行, 此处传入值的目的只是为了确认数据类型
h.dynamicStruct.AddField(field.JsonTag, "", consts.GetDataTypeDefaultValue(field.Type), fieldTag, false)
}
val := h.dynamicStruct.Build().New()
if err := serialize.JSON.UnmarshalWithNumber([]byte(h.formatVal), &val); nil != err {
@ -139,7 +134,7 @@ func (h *handle) checkRequired(field StructField) (bool, bool) {
}
// getSourceDataValue 获取源数据值
func (h *handle) getSourceDataValue(field StructField) (any, error) {
func (h *handle) formatDataValue(field StructField) (any, error) {
sourceValue := gjson.GetBytes(h.sourceData, field.SourcePath)
if !sourceValue.Exists() {
if field.Required {
@ -171,6 +166,7 @@ func (h *handle) getSourceDataValue(field StructField) (any, error) {
}
}()
switch field.Type {
case consts.DataTypeInt: // Int类型
fallthrough
case consts.DataTypeIntPtr: // Uint类型
@ -181,15 +177,17 @@ func (h *handle) getSourceDataValue(field StructField) (any, error) {
case consts.DataTypeUintPtr: // Uint类型
val, err = gjson_hack.Uint(sourceValue)
return val, err
case consts.DataTypeFloat:
case consts.DataTypeFloat32:
fallthrough
case consts.DataTypeFloatPtr: // Float类型
case consts.DataTypeFloat32Ptr: // Float类型
val, err = gjson_hack.Float64(sourceValue)
return val, err
case consts.DataTypeString: // String类型
return sourceValue.String(), nil
val = sourceValue.String()
return val, nil
case consts.DataTypeBool: // Bool类型
return sourceValue.Bool(), nil
val = sourceValue.Bool()
return val, nil
case consts.DataTypeSliceFloat: // Float slice
val, err = gjson_hack.SliceFloat(sourceValue)
return val, err

View File

@ -23,6 +23,7 @@ func TestRun_Simple_Data(t *testing.T) {
}
companyInfo := map[string]any{
"address": "beijing",
"name": "xxxx",
}
testMap := map[string]any{
@ -56,17 +57,12 @@ func TestRun_Simple_Data(t *testing.T) {
Required: false,
RuleList: []Rule{
{
Tag: "min",
Args: []string{"1"},
},
{
Tag: "max",
Args: []string{"20"},
Tag: "required",
},
},
DefaultValue: "",
SourcePath: "company.name",
TargetPath: "company.cname",
TargetPath: "company.company_name",
Errmsg: "公司名称必须在[1,20]之间",
},
{