-
Notifications
You must be signed in to change notification settings - Fork 0
/
Unmarshaler.go
55 lines (43 loc) · 1.16 KB
/
Unmarshaler.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
package gotten
import (
"io"
"io/ioutil"
"net/http"
)
type (
ReadUnmarshaler interface {
Unmarshal(reader io.ReadCloser, header http.Header, v interface{}) error
}
ReadUnmarshalFunc func(reader io.ReadCloser, header http.Header, v interface{}) error
ReaderAdapter struct {
unmarshaler Unmarshaler
}
Unmarshaler interface {
Unmarshal(data []byte, v interface{}) error
}
UnmarshalFunc func(data []byte, v interface{}) error
)
func UnmarshalAdapter(fn UnmarshalFunc) Unmarshaler {
return fn
}
//func ReaderFuncAdapter(fn ReadUnmarshalFunc) ReadUnmarshaler {
// return fn
//}
func NewReaderAdapter(unmarshaler Unmarshaler) ReadUnmarshaler {
return &ReaderAdapter{unmarshaler}
}
func (fn UnmarshalFunc) Unmarshal(data []byte, v interface{}) error {
return fn(data, v)
}
func (fn ReadUnmarshalFunc) Unmarshal(reader io.ReadCloser, header http.Header, v interface{}) error {
return fn(reader, header, v)
}
func (adapter *ReaderAdapter) Unmarshal(reader io.ReadCloser, header http.Header, v interface{}) (err error) {
var body []byte
body, err = ioutil.ReadAll(reader)
reader.Close()
if err == nil {
err = adapter.unmarshaler.Unmarshal(body, v)
}
return
}