From 45a25e0018979400168e9a3042027c857c96b498 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=99=BD=E8=8C=B6=E6=B8=85=E6=AC=A2?= Date: Thu, 13 Feb 2025 21:11:27 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E9=BB=98=E8=AE=A4=E5=80=BC?= =?UTF-8?q?=E8=A7=A3=E6=9E=90=E4=BB=A5=E5=8F=8A=E6=9E=9A=E4=B8=BE=E5=80=BC?= =?UTF-8?q?=E8=A7=A3=E6=9E=90=E7=9A=84BUG?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- define/openapi.go | 4 +-- parser_test.go | 2 +- struct_field.go | 33 +++++++++++++++++++++--- validateRule.go => validate_rule.go | 39 ++++++++++++++++++++++++++--- 4 files changed, 68 insertions(+), 10 deletions(-) rename validateRule.go => validate_rule.go (61%) diff --git a/define/openapi.go b/define/openapi.go index 7ed7962..09f1adb 100644 --- a/define/openapi.go +++ b/define/openapi.go @@ -143,8 +143,8 @@ type Schema struct { type Property struct { Type string `json:"type,omitempty"` // 数据类型, swagger本身的定义 Format string `json:"format,omitempty"` // 对应编程语言中的数据类型描述 - Enum []string `json:"enum,omitempty"` // 枚举值列表 - Default string `json:"default,omitempty"` // 默认值 : 不同于 JSON Schema,这个值必须符合定义与相同级别的 Schema 对象 中定义的类型,比如 type 是 string,那么 default 可以是 "foo" 但不能是 1。 + Enum []any `json:"enum,omitempty"` // 枚举值列表 + Default any `json:"default,omitempty"` // 默认值 : 不同于 JSON Schema,这个值必须符合定义与相同级别的 Schema 对象 中定义的类型,比如 type 是 string,那么 default 可以是 "foo" 但不能是 1。 Description string `json:"description,omitempty"` // 数据描述, CommonMark syntax可以被用来呈现富文本格式. AllOf []*PropertyXOf `json:"allOf,omitempty"` // type 是一个对象, allOf 指向对象描述 OneOf []*PropertyXOf `json:"oneOf,omitempty"` // type 是一个对象, allOf 指向对象描述 diff --git a/parser_test.go b/parser_test.go index 4bac3f7..1d5c7f6 100644 --- a/parser_test.go +++ b/parser_test.go @@ -25,7 +25,7 @@ import ( func Test_parser_Openapi3(t *testing.T) { type User struct { Name string `json:"name" d:"zhang" desc:"用户姓名" binding:"required"` - Age int `json:"age" d:"18" desc:"年龄" binding:"required,oneof:12 13 18 90"` + Age string `json:"age" d:"18" desc:"年龄" binding:"required,oneof=12 13 18 90"` } type List struct { Total int64 `json:"total" binding:"required"` diff --git a/struct_field.go b/struct_field.go index 1d4b977..20bdeb0 100644 --- a/struct_field.go +++ b/struct_field.go @@ -10,6 +10,8 @@ package api_doc import ( "git.zhangdeman.cn/gateway/api-doc/define" "reflect" + "strconv" + "strings" ) var ( @@ -62,14 +64,37 @@ func (psf parseStructField) GetParamDesc(structField reflect.StructField) string // Author : go_developer@163.com<白茶清欢> // // Date : 22:05 2025/2/11 -func (psf parseStructField) GetDefaultValue(structField reflect.StructField) string { +func (psf parseStructField) GetDefaultValue(structField reflect.StructField) any { defaultTagList := []string{define.TagD, define.TagDefault} + fieldType := structField.Type.Kind().String() for _, tag := range defaultTagList { - if tagVal, exist := structField.Tag.Lookup(tag); exist { - return tagVal + if val, exist := structField.Tag.Lookup(tag); exist && val != "" { + if strings.HasPrefix(fieldType, "int") { + i, _ := strconv.Atoi(val) + return i + } + if strings.HasPrefix(fieldType, "uint") { + uintVal, _ := strconv.ParseUint(val, 10, 64) + return uintVal + } + if strings.HasPrefix(fieldType, "float") { + floatVal, _ := strconv.ParseFloat(val, 64) + return floatVal + } + if strings.HasPrefix(fieldType, "string") { + return val + } + if strings.HasPrefix(fieldType, "bool") { + if val == "true" { + return true + } else { + return false + } + } + return val } } - return "" + return nil } // GetValidateRule 获取验证规则 diff --git a/validateRule.go b/validate_rule.go similarity index 61% rename from validateRule.go rename to validate_rule.go index 6a6f868..a4fa52c 100644 --- a/validateRule.go +++ b/validate_rule.go @@ -10,6 +10,7 @@ package api_doc import ( "git.zhangdeman.cn/zhangdeman/consts" "reflect" + "strconv" "strings" ) @@ -36,13 +37,45 @@ func (r validateRule) IsRequired(structField reflect.StructField) bool { // Author : go_developer@163.com<白茶清欢> // // Date : 17:23 2025/2/13 -func (r validateRule) Enum(structField reflect.StructField) []string { +func (r validateRule) Enum(structField reflect.StructField) []any { ruleTable := r.getValidateRuleTable(structField) oneOfValue, _ := ruleTable[consts.ValidatorRuleCommonOneOf.String()] if len(oneOfValue) == 0 { - return []string{} + return []any{} } - return strings.Split(oneOfValue, " ") + fieldType := structField.Type.Kind().String() + valStrArr := strings.Split(oneOfValue, " ") + anySlice := make([]any, 0) + for _, val := range valStrArr { + if strings.HasPrefix(fieldType, "int") { + i, _ := strconv.Atoi(val) + anySlice = append(anySlice, i) + continue + } + if strings.HasPrefix(fieldType, "uint") { + uintVal, _ := strconv.ParseUint(val, 10, 64) + anySlice = append(anySlice, uintVal) + continue + } + if strings.HasPrefix(fieldType, "float") { + floatVal, _ := strconv.ParseFloat(val, 64) + anySlice = append(anySlice, floatVal) + continue + } + if strings.HasPrefix(fieldType, "string") { + anySlice = append(anySlice, val) + continue + } + if strings.HasPrefix(fieldType, "bool") { + if val == "true" { + anySlice = append(anySlice, true) + } else { + anySlice = append(anySlice, false) + } + continue + } + } + return anySlice } // getValidateRuleTable 解析验证规则表