From b1113c328a38e4f4d83a26e295f4bd8afe398ccf Mon Sep 17 00:00:00 2001 From: John Guo Date: Fri, 8 Oct 2021 17:05:11 +0800 Subject: [PATCH] openapi --- protocol/goai/goai.go | 51 ++++++++++++++++++++++++++++++++- protocol/goai/goai_parameter.go | 27 ++++++++--------- protocol/goai/goai_shema.go | 42 --------------------------- 3 files changed, 62 insertions(+), 58 deletions(-) diff --git a/protocol/goai/goai.go b/protocol/goai/goai.go index 2f697b62b..af70a9b0d 100644 --- a/protocol/goai/goai.go +++ b/protocol/goai/goai.go @@ -80,7 +80,6 @@ const ( const ( TagNamePath = `path` TagNameMethod = `method` - TagNameIn = `in` TagNameMime = `mime` TagNameValidate = `v` ) @@ -142,6 +141,56 @@ func (oai OpenApiV3) String() string { return string(b) } +func (oai *OpenApiV3) golangTypeToOAIType(t reflect.Type) string { + for t.Kind() == reflect.Ptr { + t = t.Elem() + } + switch t.Kind() { + case reflect.String: + return TypeString + + case reflect.Struct: + switch t.String() { + case `time.Time`, `gtime.Time`: + return TypeString + } + return TypeObject + + case reflect.Slice, reflect.Array: + switch t.String() { + case `[]uint8`: + return TypeString + } + return TypeArray + + case reflect.Bool: + return TypeBoolean + + case + reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64, + reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64, + reflect.Float32, reflect.Float64, + reflect.Complex64, reflect.Complex128: + return TypeNumber + + default: + return TypeObject + } +} + +// golangTypeToOAIFormat converts and returns OpenAPI parameter format for given golang type `t`. +// Note that it does not return standard OpenAPI parameter format but custom format in golang type. +func (oai *OpenApiV3) golangTypeToOAIFormat(t reflect.Type) string { + format := t.String() + switch gstr.TrimLeft(format, "*") { + case `[]uint8`: + return FormatBinary + + default: + return format + } +} + func formatRefToBytes(ref string) []byte { return []byte(fmt.Sprintf(`{"$ref":"#/components/schemas/%s"}`, ref)) } diff --git a/protocol/goai/goai_parameter.go b/protocol/goai/goai_parameter.go index e6feb3105..09a951fce 100644 --- a/protocol/goai/goai_parameter.go +++ b/protocol/goai/goai_parameter.go @@ -42,19 +42,6 @@ type ParameterRef struct { } func (oai *OpenApiV3) newParameterRefWithStructMethod(field *structs.Field, method string) (*ParameterRef, error) { - var ( - inTagValue = field.Tag(TagNameIn) - ) - if inTagValue == "" { - // Default the parameter input to "query" if method is "GET/DELETE". - switch gstr.ToUpper(method) { - case HttpMethodGet, HttpMethodDelete: - inTagValue = ParameterInQuery - - default: - return nil, nil - } - } var ( tagMap = field.TagMap() parameter = &Parameter{ @@ -70,8 +57,18 @@ func (oai *OpenApiV3) newParameterRefWithStructMethod(field *structs.Field, meth return nil, gerror.WrapCode(gcode.CodeInternalError, err, `mapping struct tags to Parameter failed`) } } + if parameter.In == "" { + // Default the parameter input to "query" if method is "GET/DELETE". + switch gstr.ToUpper(method) { + case HttpMethodGet, HttpMethodDelete: + parameter.In = ParameterInQuery - switch inTagValue { + default: + return nil, nil + } + } + + switch parameter.In { case ParameterInPath: // Required for path parameter. parameter.Required = true @@ -83,7 +80,7 @@ func (oai *OpenApiV3) newParameterRefWithStructMethod(field *structs.Field, meth } default: - return nil, gerror.NewCodef(gcode.CodeInvalidParameter, `invalid tag value "%s" for In`, inTagValue) + return nil, gerror.NewCodef(gcode.CodeInvalidParameter, `invalid tag value "%s" for In`, parameter.In) } // Necessary schema or content. schemaRef, err := oai.newSchemaRefWithGolangType(field.Type(), tagMap) diff --git a/protocol/goai/goai_shema.go b/protocol/goai/goai_shema.go index 73de2aaae..2e96314f2 100644 --- a/protocol/goai/goai_shema.go +++ b/protocol/goai/goai_shema.go @@ -121,45 +121,3 @@ func (oai *OpenApiV3) doAddSchemaSingle(object interface{}) error { } return nil } - -func (oai *OpenApiV3) golangTypeToOAIType(t reflect.Type) string { - for t.Kind() == reflect.Ptr { - t = t.Elem() - } - switch t.Kind() { - case reflect.String: - return TypeString - - case reflect.Struct: - switch t.String() { - case - `time.Time`, - `gtime.Time`: - return TypeString - } - return TypeObject - - case reflect.Slice, reflect.Array: - - return TypeArray - - case reflect.Bool: - return TypeBoolean - - case - reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64, - reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64, - reflect.Float32, reflect.Float64, - reflect.Complex64, reflect.Complex128: - return TypeNumber - - default: - return TypeObject - } -} - -// golangTypeToOAIFormat converts and returns OpenAPI parameter format for given golang type `t`. -// Note that it does not return standard OpenAPI parameter format but custom format in golang type. -func (oai *OpenApiV3) golangTypeToOAIFormat(t reflect.Type) string { - return t.String() -}