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:
		@ -16,7 +16,15 @@ import (
 | 
			
		||||
	"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 {
 | 
			
		||||
	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
 | 
			
		||||
				continue
 | 
			
		||||
			}
 | 
			
		||||
			ok, err := mapping(value.Field(i), tValue.Field(i), setter, tag)
 | 
			
		||||
			ok, err := mapping(value.Field(i), sf, setter, tag)
 | 
			
		||||
			if err != nil {
 | 
			
		||||
				return false, err
 | 
			
		||||
			}
 | 
			
		||||
@ -371,7 +379,7 @@ func setFormMap(ptr interface{}, form map[string][]string) error {
 | 
			
		||||
	if el.Kind() == reflect.Slice {
 | 
			
		||||
		ptrMap, ok := ptr.(map[string][]string)
 | 
			
		||||
		if !ok {
 | 
			
		||||
			return errors.New("cannot convert to map slices of strings")
 | 
			
		||||
			return ErrConvertMapStringSlice
 | 
			
		||||
		}
 | 
			
		||||
		for k, v := range form {
 | 
			
		||||
			ptrMap[k] = v
 | 
			
		||||
@ -382,7 +390,7 @@ func setFormMap(ptr interface{}, form map[string][]string) error {
 | 
			
		||||
 | 
			
		||||
	ptrMap, ok := ptr.(map[string]string)
 | 
			
		||||
	if !ok {
 | 
			
		||||
		return errors.New("cannot convert to map of strings")
 | 
			
		||||
		return ErrConvertToMapString
 | 
			
		||||
	}
 | 
			
		||||
	for k, v := range form {
 | 
			
		||||
		ptrMap[k] = v[len(v)-1] // pick last
 | 
			
		||||
 | 
			
		||||
@ -29,6 +29,6 @@ type headerSource map[string][]string
 | 
			
		||||
 | 
			
		||||
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)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@ -15,8 +15,16 @@ type multipartRequest http.Request
 | 
			
		||||
 | 
			
		||||
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
 | 
			
		||||
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 {
 | 
			
		||||
		return setByMultipartFormFile(value, field, files)
 | 
			
		||||
	}
 | 
			
		||||
@ -49,12 +57,12 @@ func setByMultipartFormFile(value reflect.Value, field reflect.StructField, file
 | 
			
		||||
	case reflect.Array:
 | 
			
		||||
		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) {
 | 
			
		||||
	if value.Len() != len(files) {
 | 
			
		||||
		return false, errors.New("unsupported len of array for []*multipart.FileHeader")
 | 
			
		||||
		return false, ErrMultiFileHeaderLenInvalid
 | 
			
		||||
	}
 | 
			
		||||
	for i := range files {
 | 
			
		||||
		setted, err := setByMultipartFormFile(value.Index(i), field, files[i:i+1])
 | 
			
		||||
 | 
			
		||||
@ -46,9 +46,11 @@ type PureJSON struct {
 | 
			
		||||
	Data interface{}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
var jsonContentType = []string{"application/json; charset=utf-8"}
 | 
			
		||||
var jsonpContentType = []string{"application/javascript; charset=utf-8"}
 | 
			
		||||
var jsonAsciiContentType = []string{"application/json"}
 | 
			
		||||
var (
 | 
			
		||||
	jsonContentType      = []string{"application/json; charset=utf-8"}
 | 
			
		||||
	jsonpContentType     = []string{"application/javascript; charset=utf-8"}
 | 
			
		||||
	jsonAsciiContentType = []string{"application/json"}
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
// Render (JSON) writes data with custom ContentType.
 | 
			
		||||
func (r JSON) Render(w http.ResponseWriter) (err error) {
 | 
			
		||||
 | 
			
		||||
		Reference in New Issue
	
	Block a user