/
unmarshal.go
executable file
·72 lines (61 loc) · 1.57 KB
/
unmarshal.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
package helpers
import (
"encoding/json"
"errors"
"fmt"
"net/http"
"reflect"
"strings"
log "github.com/sirupsen/logrus"
"github.com/spf13/cast"
)
func Unmarshal(r *http.Request, dst interface{}) (err error) {
if r.Method == http.MethodGet {
t := reflect.TypeOf(dst).Elem()
v := reflect.ValueOf(dst).Elem()
if err := r.ParseForm(); err != nil {
return err
}
for i := 0; i < t.NumField(); i++ {
jsonTag := t.Field(i).Tag.Get(TagNameJSON)
jsonParams := strings.Split(jsonTag, ",")
if len(jsonParams) == 0 {
continue
}
jsonName := jsonParams[0]
validateTag := t.Field(i).Tag.Get(TagNameValidate)
validateParams := strings.Split(validateTag, ",")
required := false
for _, param := range validateParams {
if param == ValidateStrRequired {
required = true
}
}
formValue := r.Form.Get(jsonName)
if formValue == "" && required {
return errors.New("Empty required field")
}
v.Field(i).Set(reflect.New(v.Field(i).Type().Elem()))
switch v.Field(i).Type() {
case TypeOfStringP:
v.Field(i).Elem().SetString(formValue)
case TypeOfIntP:
fallthrough
case TypeOfInt64P:
v.Field(i).Elem().SetInt(cast.ToInt64(formValue))
case TypeOfFloat64P:
v.Field(i).Elem().SetFloat(cast.ToFloat64(formValue))
case TypeOfFloat32P:
return errors.New("Float32 not supported")
default:
return errors.New(fmt.Sprint("Field not set:", v.Type().Field(i).Name))
}
}
return
}
if err := json.NewDecoder(r.Body).Decode(dst); err != nil {
log.Debug("Error decoding r.Body")
return err
}
return
}