This commit is contained in:
John Guo
2021-10-08 17:05:11 +08:00
parent 26d823bd81
commit b1113c328a
3 changed files with 62 additions and 58 deletions

View File

@ -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))
}

View File

@ -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)

View File

@ -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()
}