mirror of https://github.com/gin-gonic/gin.git
Optimize code adjust (#2700)
* setFormMap error of result * adjust code for TrySet * error export for type multipart.FileHeader * code style adjust * reflect code maping optimize * Update form_mapping.go Co-authored-by: Bo-Yi Wu <appleboy.tw@gmail.com> Co-authored-by: thinkerou <thinkerou@gmail.com>
This commit is contained in:
parent
6703dea51c
commit
97a32b1de3
|
@ -16,7 +16,15 @@ import (
|
||||||
"github.com/gin-gonic/gin/internal/json"
|
"github.com/gin-gonic/gin/internal/json"
|
||||||
)
|
)
|
||||||
|
|
||||||
var errUnknownType = errors.New("unknown type")
|
var (
|
||||||
|
errUnknownType = errors.New("unknown type")
|
||||||
|
|
||||||
|
// ErrConvertMapStringSlice can not covert to map[string][]string
|
||||||
|
ErrConvertMapStringSlice = errors.New("can not convert to map slices of strings")
|
||||||
|
|
||||||
|
// ErrConvertToMapString can not convert to map[string]string
|
||||||
|
ErrConvertToMapString = errors.New("can not convert to map of strings")
|
||||||
|
)
|
||||||
|
|
||||||
func mapUri(ptr interface{}, m map[string][]string) error {
|
func mapUri(ptr interface{}, m map[string][]string) error {
|
||||||
return mapFormByTag(ptr, m, "uri")
|
return mapFormByTag(ptr, m, "uri")
|
||||||
|
@ -109,7 +117,7 @@ func mapping(value reflect.Value, field reflect.StructField, setter setter, tag
|
||||||
if sf.PkgPath != "" && !sf.Anonymous { // unexported
|
if sf.PkgPath != "" && !sf.Anonymous { // unexported
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
ok, err := mapping(value.Field(i), tValue.Field(i), setter, tag)
|
ok, err := mapping(value.Field(i), sf, setter, tag)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return false, err
|
return false, err
|
||||||
}
|
}
|
||||||
|
@ -371,7 +379,7 @@ func setFormMap(ptr interface{}, form map[string][]string) error {
|
||||||
if el.Kind() == reflect.Slice {
|
if el.Kind() == reflect.Slice {
|
||||||
ptrMap, ok := ptr.(map[string][]string)
|
ptrMap, ok := ptr.(map[string][]string)
|
||||||
if !ok {
|
if !ok {
|
||||||
return errors.New("cannot convert to map slices of strings")
|
return ErrConvertMapStringSlice
|
||||||
}
|
}
|
||||||
for k, v := range form {
|
for k, v := range form {
|
||||||
ptrMap[k] = v
|
ptrMap[k] = v
|
||||||
|
@ -382,7 +390,7 @@ func setFormMap(ptr interface{}, form map[string][]string) error {
|
||||||
|
|
||||||
ptrMap, ok := ptr.(map[string]string)
|
ptrMap, ok := ptr.(map[string]string)
|
||||||
if !ok {
|
if !ok {
|
||||||
return errors.New("cannot convert to map of strings")
|
return ErrConvertToMapString
|
||||||
}
|
}
|
||||||
for k, v := range form {
|
for k, v := range form {
|
||||||
ptrMap[k] = v[len(v)-1] // pick last
|
ptrMap[k] = v[len(v)-1] // pick last
|
||||||
|
|
|
@ -29,6 +29,6 @@ type headerSource map[string][]string
|
||||||
|
|
||||||
var _ setter = headerSource(nil)
|
var _ setter = headerSource(nil)
|
||||||
|
|
||||||
func (hs headerSource) TrySet(value reflect.Value, field reflect.StructField, tagValue string, opt setOptions) (isSetted bool, err error) {
|
func (hs headerSource) TrySet(value reflect.Value, field reflect.StructField, tagValue string, opt setOptions) (bool, error) {
|
||||||
return setByForm(value, field, hs, textproto.CanonicalMIMEHeaderKey(tagValue), opt)
|
return setByForm(value, field, hs, textproto.CanonicalMIMEHeaderKey(tagValue), opt)
|
||||||
}
|
}
|
||||||
|
|
|
@ -15,8 +15,16 @@ type multipartRequest http.Request
|
||||||
|
|
||||||
var _ setter = (*multipartRequest)(nil)
|
var _ setter = (*multipartRequest)(nil)
|
||||||
|
|
||||||
|
var (
|
||||||
|
// ErrMultiFileHeader multipart.FileHeader invalid
|
||||||
|
ErrMultiFileHeader = errors.New("unsupported field type for multipart.FileHeader")
|
||||||
|
|
||||||
|
// ErrMultiFileHeaderLenInvalid array for []*multipart.FileHeader len invalid
|
||||||
|
ErrMultiFileHeaderLenInvalid = errors.New("unsupported len of array for []*multipart.FileHeader")
|
||||||
|
)
|
||||||
|
|
||||||
// TrySet tries to set a value by the multipart request with the binding a form file
|
// TrySet tries to set a value by the multipart request with the binding a form file
|
||||||
func (r *multipartRequest) TrySet(value reflect.Value, field reflect.StructField, key string, opt setOptions) (isSetted bool, err error) {
|
func (r *multipartRequest) TrySet(value reflect.Value, field reflect.StructField, key string, opt setOptions) (bool, error) {
|
||||||
if files := r.MultipartForm.File[key]; len(files) != 0 {
|
if files := r.MultipartForm.File[key]; len(files) != 0 {
|
||||||
return setByMultipartFormFile(value, field, files)
|
return setByMultipartFormFile(value, field, files)
|
||||||
}
|
}
|
||||||
|
@ -49,12 +57,12 @@ func setByMultipartFormFile(value reflect.Value, field reflect.StructField, file
|
||||||
case reflect.Array:
|
case reflect.Array:
|
||||||
return setArrayOfMultipartFormFiles(value, field, files)
|
return setArrayOfMultipartFormFiles(value, field, files)
|
||||||
}
|
}
|
||||||
return false, errors.New("unsupported field type for multipart.FileHeader")
|
return false, ErrMultiFileHeader
|
||||||
}
|
}
|
||||||
|
|
||||||
func setArrayOfMultipartFormFiles(value reflect.Value, field reflect.StructField, files []*multipart.FileHeader) (isSetted bool, err error) {
|
func setArrayOfMultipartFormFiles(value reflect.Value, field reflect.StructField, files []*multipart.FileHeader) (isSetted bool, err error) {
|
||||||
if value.Len() != len(files) {
|
if value.Len() != len(files) {
|
||||||
return false, errors.New("unsupported len of array for []*multipart.FileHeader")
|
return false, ErrMultiFileHeaderLenInvalid
|
||||||
}
|
}
|
||||||
for i := range files {
|
for i := range files {
|
||||||
setted, err := setByMultipartFormFile(value.Index(i), field, files[i:i+1])
|
setted, err := setByMultipartFormFile(value.Index(i), field, files[i:i+1])
|
||||||
|
|
|
@ -46,9 +46,11 @@ type PureJSON struct {
|
||||||
Data interface{}
|
Data interface{}
|
||||||
}
|
}
|
||||||
|
|
||||||
var jsonContentType = []string{"application/json; charset=utf-8"}
|
var (
|
||||||
var jsonpContentType = []string{"application/javascript; charset=utf-8"}
|
jsonContentType = []string{"application/json; charset=utf-8"}
|
||||||
var jsonAsciiContentType = []string{"application/json"}
|
jsonpContentType = []string{"application/javascript; charset=utf-8"}
|
||||||
|
jsonAsciiContentType = []string{"application/json"}
|
||||||
|
)
|
||||||
|
|
||||||
// Render (JSON) writes data with custom ContentType.
|
// Render (JSON) writes data with custom ContentType.
|
||||||
func (r JSON) Render(w http.ResponseWriter) (err error) {
|
func (r JSON) Render(w http.ResponseWriter) (err error) {
|
||||||
|
|
Loading…
Reference in New Issue