-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathcontroller.go
More file actions
65 lines (52 loc) · 1.31 KB
/
controller.go
File metadata and controls
65 lines (52 loc) · 1.31 KB
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
package json_controller
import (
"bytes"
"encoding/json"
"fmt"
"io"
"github.com/pkg/errors"
"github.com/toolsparty/mvc"
"github.com/valyala/fasthttp"
)
// implements abstract controller
type JSONController struct {
*mvc.BaseController
view mvc.View
}
func (b *JSONController) Init() error {
return b.BaseController.Init()
}
// Context returns *fasthttp.RequestCtx (from interface{}) or error
func (JSONController) Context(v interface{}) (*fasthttp.RequestCtx, error) {
ctx, ok := v.(*fasthttp.RequestCtx)
if !ok {
return nil, errors.New(fmt.Sprintf("%T is not *fasthttp.RequestCtx", v))
}
return ctx, nil
}
// Render encode interface{} to JSON and write to writer
func (b JSONController) Render(w io.Writer, v interface{}) error {
b.SetHeaders(w)
encoder := json.NewEncoder(w)
err := encoder.Encode(v)
if err != nil {
return errors.Wrap(err, "encoding to json failed")
}
return nil
}
// Decode struct from bytes
func (JSONController) Decode(b []byte, v interface{}) error {
decoder := json.NewDecoder(bytes.NewReader(b))
err := decoder.Decode(v)
if err != nil {
return errors.Wrap(err, "decoding json failed")
}
return nil
}
// Set content-type header for json
func (JSONController) SetHeaders(w io.Writer) {
wr, ok := w.(*fasthttp.RequestCtx)
if ok {
wr.SetContentType("application/json")
}
}